有条件地更改字符串名称

时间:2019-06-06 18:45:24

标签: sql-server

我有一个大型数据源,该数据源会自动上载到SQL Server表中,因此无法手动更改数据。时不时地有记录贴错标签。 98%的数据集包含唯一的Patient_fins;但是,对于去过两个地点(ED和EDU)的患者,复制了Patient_fin,这很好。例如,

  Patient_fin    CHECKIN_DATE_TIME       TRACKING_GROUP
    1           2018-01-01 01:37:00          EDU
    1           2018-01-01 04:37:00          ED

当患者跟踪组的标签不正确时(当CHECKIN_DATE_TIME不同时,两个标签都相同),我遇到了问题。例如,我从CHECKIN_DATE_TIME可以知道患者去过ED和EDU两个不同的位置,但是跟踪组是相同的。 Patient_fin 1跟踪组的第二行应显示为“ ED”

   Patient_fin CHECKIN_DATE_TIME       TRACKING_GROUP
      1           2018-01-01 01:37:00          EDU
      1           2018-01-01 04:37:00          EDU

对于TRACKING GROUP不正确的实例,SQL中是否可以通过稍后的CHECKIN_DATE_TIME重新编码记录,以便TRACKING_GROUP读取ED。先验知识告诉我以后的CHECKIN_DATE_TIME将始终与ED而不是EDU关联。

1 个答案:

答案 0 :(得分:2)

如果只有两条记录具有相同的Patient_fin,并且您不需要考虑第一条记录是ED,那么会发生什么呢?然后,您将剩下两条记录为TRACKING_GROUP = ED的记录:

--This will do pretty much what Sean Lange described except instead of a cte, it uses
--A subquery to get the records with a row number, partitioned by the Patient_fin
--It then joins this on the table by Patient_fin and CHECKIN_DATE_TIME and updates the second record for a Patient_fin
UPDATE dbo.SomTable
SET TRACKING_GROUP = 'ED'
FROM dbo.SomeTable AS st
INNER JOIN
(
    SELECT Patient_fin, CHECKIN_DATE_TIME, ROW_NUMBER() OVER(PARTITION BY Patient_fin ORDER BY Patient_fin) AS [RowNumer]
    FROM dbo.SomeTable
) AS x
ON x.CHECKIN_DATE_TIME = st.CHECKIN_DATE_TIME AND x.Patient_fin = st.Patient_fin
WHERE x.RowNum = 2