首页 > 解决方案 > 识别记录的最新状态以及上次更改的时间

问题描述

感谢您提供机会来解释我的问题。我有一张表格,其中记录了所有入院患者的最新状态。(带有示例数据的表结构如下)。要求是显示每个患者的最新状态以及最新状态出现的时间。

 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)

但是现在的问题是检索此状态的最后更改是一个挑战。任何可以提供帮助的人,非常感谢。

谢谢。

标签: sql-servergroup-by

解决方案


这里不需要子查询。窗口功能将ROW_NUMBER()一次性为您提供所需的一切。

ORDER BY子句将您的结果按 分组PatientID,然后该子句根据子子句中的TOP (1) WITH TIES将返回的行限制为最近的条目。ORDER BYOVER

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

推荐阅读