我知道這是舊的,但竊聽我,如果未來發生相互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
爲了增加獲得能回答這個問題的用戶的關注的機會,你應該[編輯],並添加適用的語言[標籤](HTTP ://stackoverflow.com/help/tagging)。我猜這是SQL,如果是這樣,請同時添加一個標籤來指示您正在使用的SQL DB。 – Dukeling
患者是否可以有多個「H EMERGENCY MEDICINE」條目?如果是這樣,你想要檢索什麼結果? –
請不要破壞你的問題。如果存在需要刪除的有效理由,請將帖子標記爲主持人注意,或使用頁面底部的聯繫鏈接。 – theB