我知道这是旧的,但如果 2 个紧急记录彼此相邻,另一个答案不会返回正确答案,这让我很烦恼。第一条记录将错误地显示第二条记录而不是 null,因为在这种情况下,两个紧急情况之间不会有非紧急记录。我偶然发现了这个查找另一个查询,所以我想提供一个更新,以防其他人偶然发现这个。
下面的查询使用OUTER APPLY 而不是CROSS APPLY 和ROW_NUMBER 来获得正确的下一个服务。
DECLARE @S TABLE (
[Service] NVARCHAR(40),
[DateTimeIn] DATETIME,
[PatientId] INT
)
INSERT @S
SELECT 'H EMERGENCY MEDICINE', '2013-01-01 10:43:00.000', 1
UNION ALL SELECT 'H MEDICINE E', '2013-01-06 23:43:00.000', 1
UNION ALL SELECT 'H MEDICINE E', '2013-01-07 17:18:00.000', 1
UNION ALL SELECT 'H MEDICINE ICU', '2013-01-01 15:38:00.000', 1
UNION ALL SELECT 'H EMERGENCY MEDICINE', '2013-01-07 1:41:00.000', 1
UNION ALL SELECT 'H EMERGENCY MEDICINE', '2013-01-07 1:43:00.000', 1
UNION ALL SELECT 'H MEDICINE ICU', '2013-01-07 00:49:00.000', 1
UNION ALL SELECT 'H MEDICINE ICU', '2013-01-08 04:36:00.000', 1
DECLARE @PatientId INT = 1
;WITH CTE AS (
SELECT *,
CASE WHEN S.Service = 'H EMERGENCY MEDICINE' THEN 1 ELSE 0 END AS IsEmergency,
ROW_NUMBER() OVER ( ORDER BY DateTimeIn ) AS RowNum
FROM @S S
WHERE S.PatientId = @PatientId
)
SELECT
E.Service,
E.DateTimeIn,
N.NextService,
N.NextDateTimeIn
FROM CTE E
OUTER APPLY (
SELECT TOP 1
Service AS NextService,
DateTimeIn AS NextDateTimeIn
FROM CTE
WHERE IsEmergency = 0
AND RowNum = E.RowNum + 1
) N
WHERE IsEmergency = 1
这将输出:
Service DateTimeIn NextService NextDateTimeIn
------------------------- ----------------------- ------------------------- -----------------------
H EMERGENCY MEDICINE 2013-01-01 10:43:00.000 H MEDICINE ICU 2013-01-01 15:38:00.000
H EMERGENCY MEDICINE 2013-01-07 01:41:00.000 NULL NULL
H EMERGENCY MEDICINE 2013-01-07 01:43:00.000 H MEDICINE E 2013-01-07 17:18:00.000