Определите последний статус записи и когда она была в последний раз изменена - PullRequest
0 голосов
/ 01 июля 2019

Спасибо за предоставленную возможность объяснить мою проблему.У меня есть таблица, в которой отражен последний статус всех пациентов, поступивших в больницу.(структура таблицы с образцами данных ниже).Требование состоит в том, чтобы отображался последний статус каждого пациента и время появления последнего статуса.

 ID | PatientId |       Status       |       TimeOfStatusChange 
----------
 1  |    1 |           Admitted |            2019-07-01 10:00 AM
----------
2  |    1   |         In Triage      |       2019-07-01 10:15 AM
----------
3  |    1       |     In Triage  |          2019-07-01 10:30 AM
----------
4   |   1   |         Surgery Scheduled  |   2019-07-01 11:00 AM
----------
5   |   1      |      In Triage     |        2019-07-01 11:30 AM
----------
6   |   1    |        Surgery Scheduled  |   2019-07-01 12:01 PM
----------
7    |  1    |        Surgery Scheduled   |  2019-07-01 12:30 PM
----------

Итак, в этом примере пациент поступил в 10 часов утра.его последний статус - «Запланированная операция», а последним изменением этого статуса было «12:01 вечера».Итак, ожидаемый результат:

PatientId  |    RecentStatus  |     TimeWhenStatusAppeared
----------
1    |          Surgery Scheduled  |  2019-07-01 12:01 PM 

Получение последнего статуса было довольно простым, и запрос, который помогает:

select PatientId, Status from StatusTest s1 where s1.ID = 
    ( select max(ID) from StatusTest s2 where s1.PatientId = s2.PatientId)

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Все У меня сработало следующее решение:

/ *****

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

****** /

WITH CTE AS (
SELECT StatusDateTime, PatientId, LevelOfCare,
LAG(LevelOfCare) OVER (ORDER BY StatusDateTime) AS [PREVIOUS]
FROM StatusTest),
ALL_STATS AS (SELECT TOP 1 * FROM CTE 
UNION ALL SELECT * FROM CTE
WHERE LevelOfCare <> [PREVIOUS]
),
CTE_ROW_NUM AS (
SELECT  PatientId, StatusDateTime, LevelOfCare,
row_number() over(partition by PatientId order by PatientId,StatusDateTime desc) as RowNum
 FROM ALL_STATS 
)
select *
from CTE_ROW_NUM
where RowNum = 1;

Пожалуйста, дайте мне знать по любым вопросам

0 голосов
/ 01 июля 2019

Здесь нет необходимости в подзапросе. ROW_NUMBER() оконная функция даст вам все необходимое за один раз.

Предложение ORDER BY разбивает ваши результаты на группы по PatientID, а затем предложение TOP (1) WITH TIES ограничивает строки, возвращаемые самой последней записью, основываясь на ORDER BY в подпункте OVER. .

SELECT TOP (1) WITH TIES
  PatientID,
  Status,
  TimeOfStatusChange AS TimeWhenStatusAppeared
FROM
  StatusTest
ORDER BY 
  ROW_NUMBER() OVER (PARTITION BY PatientID ORDER BY TimeOfStatusChange DESC);
...