Условно изменить строковое имя - PullRequest
0 голосов
/ 06 июня 2019

У меня большой источник данных, который автоматически загружается в таблицу 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 Ответ

2 голосов
/ 06 июня 2019

Если только когда-нибудь будут две записи с одним и тем же 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...