2014-02-12 21 views
1

我有一張表,其中包含患者服務列表以及他們何時到達該服務。我希望能夠在緊急情況部門之後提供第一項服務。下面是表:查找與日期時間有關的MIN nvarchar

Service     DateTimeIn 
    H EMERGENCY MEDICINE 2013-01-01 10:43:00.000 
    H MEDICINE E   2013-01-06 23:43:00.000 
    H MEDICINE E   2013-01-07 17:18:00.000 
    H MEDICINE ICU   2013-01-01 15:38:00.000 
    H MEDICINE ICU   2013-01-07 00:49:00.000 
    H MEDICINE ICU   2013-01-08 04:36:00.000 

當我使用MIN(服務),其中服務<> 1 H急診醫學「它拉的服務按字母順序排列,這不是我所需要的。我需要與緊急醫療服務後的最短時間相關的第一項服務。在這種情況下,它將是H醫學重症監護病房。我應該如何安排我的查詢邏輯,以便根據最小日期時間調用最小服務?

謝謝

+0

爲了增加獲得能回答這個問題的用戶的關注的機會,你應該[編輯],並添加適用的語言[標籤](HTTP ://stackoverflow.com/help/tagging)。我猜這是SQL,如果是這樣,請同時添加一個標籤來指示您正在使用的SQL DB。 – Dukeling

+0

患者是否可以有多個「H EMERGENCY MEDICINE」條目?如果是這樣,你想要檢索什麼結果? –

+0

請不要破壞你的問題。如果存在需要刪除的有效理由,請將帖子標記爲主持人注意,或使用頁面底部的聯繫鏈接。 – theB

回答

1

您需要過濾查詢到只有那1 H急診醫學「入境後發生,排序DateTimeIn行,然後搶在第一個(TOP 1)。僞代碼解決方案將類似於此:

​​
0

我知道這是舊的,但竊聽我,如果未來發生相互2個緊急記錄對方的回答沒有返回正確的答案。第一條記錄會錯誤地顯示第二條記錄而不是null,因爲在這種情況下,兩個緊急情況之間不會有非緊急記錄。我偶然發現了另一個查詢,所以我想提供一個更新,以防其他人偶然發現這個問題。

以下查詢使用OUTER APPLY而不是CROSS APPLYROW_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