Группировка SQL по различиям между строками? - PullRequest
0 голосов
/ 25 марта 2020

Я беру мин и макс нескольких точек данных, но в некоторых из них пациент отправляется в одно и то же место в разные дни. Есть ли способ добавить индекс или код, который отличает их как отдельные группы, основанные на порядке по утверждению или что-то подобное? Я хочу выделить guish их как отдельные группы (разделяя, что пациент покинул одно место, перешел в новое, а затем вернулся в исходное место (рассматривая его как новое место с точки зрения группировки)?

Вот код для создания фиктивной таблицы данных.

    CREATE TABLE #StartandStop (
     [hospitalname] varchar(255),
     pt_id varchar(255),
     [Location] varchar(255),
     startdatetime datetime,
     enddatetime datetime
     ); 

     INSERT INTO #StartandStop ([hospitalname],[pt_id],[Location],[startdatetime],[enddatetime])
     VALUES ('ClevelandClinic', '1','A','01-01-2020 10:35', '01-02-2020 12:30'),
     ('ClevelandClinic', '1','B','01-02-2020 12:30', '01-03-2020 00:00'),
     ('ClevelandClinic', '1','B','01-03-2020 00:00', '01-04-2020 00:00'),
     ('ClevelandClinic', '1','B','01-04-2020 00:00', '01-04-2020 19:30'),
     ('ClevelandClinic', '1','C','01-04-2020 19:30', '01-05-2020 18:44'),
     ('ClevelandClinic', '1','B','01-05-2020 18:44', '01-05-2020 07:09'),
     ('ClevelandClinic', '1','D','01-05-2020 07:09', '01-05-2020 22:22'),
     ('ClevelandClinic', '1','D','01-05-2020 22:22', '01-06-2020 00:00'),
     ('ClevelandClinic', '1','D','01-06-2020 00:00', '01-07-2020 00:00'),
     ('ClevelandClinic', '1','D','01-07-2020 00:00', '01-08-2020 00:00'),
     ('ClevelandClinic', '1','C','01-08-2020 00:00', '01-08-2020 20:02');

Это код для получения результатов.

 select hospitalname,pt_id,location,min(startdatetime) as 'Start',max(enddatetime) as 'End'
  from  #StartandStop
 group by hospitalname,pt_id,location

Это результаты, которые я получаю, когда просто принимая минимальный старт и максимальную остановку каждого без учета движений пациента назад и вперед между единицами.

   hospitalname        pt_id    location    Start                       End
   ClevelandClinic     1         A          2020-01-01 10:35:00.000     2020-01-02 12:30:00.000
   ClevelandClinic     1         B          2020-01-02 12:30:00.000     2020-01-05 07:09:00.000
   ClevelandClinic     1         C          2020-01-04 19:30:00.000     2020-01-08 20:02:00.000
   ClevelandClinic     1         D          2020-01-05 07:09:00.000     2020-01-08 00:00:00.000

Вот результаты, которые я пытаюсь получить:

 Hospital        Patient     Location     Start                          Stop
 ClevelandClinic    1        A            2020-01-01 10:35:00.000        2020-01-02 12:30:00.000
 ClevelandClinic    1        B            2020-01-02 12:30:00.000        2020-01-04 19:30:00.000
 ClevelandClinic    1        C            2020-01-04 19:30:00.000        2020-01-05 18:44:00.000
 ClevelandClinic    1        B            2020-01-05 18:44:00.000        2020-01-05 07:09:00.000
 ClevelandClinic    1        D            2020-01-05 07:09:00.000        2020-01-08 00:00:00.000
 ClevelandClinic    1        C            2020-01-08 00:00:00.000        2020-01-08 20:02:00.000

Пожалуйста, сообщите, если есть способ пометить или отличить guish первое и второе посещения одного и того же места как разные. Спасибо!

1 Ответ

1 голос
/ 27 марта 2020
ALTER TABLE #StartandStop ADD color INT

DECLARE @color INT
SELECT @color = 0

UPDATE ss SET color = @color, @color = CASE WHEN s.Location <> s.LastLocation THEN @color + 1 ELSE @color END
FROM #StartandStop ss JOIN (SELECT hospitalname, pt_id, Location, LAG(location) OVER (ORDER BY hospitalname,pt_id,startdatetime,location) AS LastLocation, startdatetime, enddatetime 
    FROM #StartandStop) s ON (ss.hospitalname = s.hospitalname AND ss.pt_id = s.pt_id AND ss.location = s.location AND ss.startdatetime = s.startdatetime AND ss.enddatetime = s.enddatetime)

SELECT hospitalname AS Hospital, pt_id AS Patient, MIN(Location) AS Location, MIN(startdatetime) AS Start, MAX(enddatetime) AS Stop
FROM #StartandStop
GROUP BY hospitalname,pt_id,color
ORDER BY 1,2,4,3
...