2017-04-05 135 views
1

我在查詢2016年1月1日至2016年12月31日期間入院的患者的結果集,他死了。SQL子查詢根據兩個日期之間的差異計算記錄數

作爲結果集的一部分,我需要包括一個專欄(「先前錄取次數」),該專欄可以顯示患者在最後入院日期之前的12個月內的所有預先錄取。

因此,如果患者於2016年6月1日入院並死亡,並且在2015年7月1日和2015年9月30日之前有2次入院,則此列中的總數爲「2」。

因此,邏輯必須是:如果患者在xx/xx/xxxx日期被錄取並死亡,請計算入住日期與xx/xx/xxxx在365天內的同一患者的先前錄取人數。

我試着這樣做的以下子查詢,但得到的2個問題:

1)查詢似乎計數表中的所有記錄招生,而不僅僅是那些與患者個體。 2)結果排除了只有出席者是他們最後一個(即他們沒有在前出席)的任何患者。如果他們之前沒有出席,我希望0出現在列中。

請任何人都可以建議正確的方法/語法?

這是子查詢我已經嘗試:

SELECT DISTINCT 
EP.Patient_Id 
,EP.Admission_Date 'Final Admission Date' 
,(
    SELECT COUNT(*) 
    FROM Inpatients.vw_IP_Episodes IP 
    WHERE DATEDIFF(day,IP.Admission_Date,EP.Admission_Date) < '365' 
    AND IP.Discharge_Method != 'Patient died' 
) 
AS 'No of Prior Admissions' 

FROM Inpatients.vw_IP_Episodes EP 
WHERE EP.Admission_Date BETWEEN '01/01/2016' AND '31/12/2016' 
AND EP.Discharge_Method = 'Patient died' 

GROUP BY EP.Patient_Id, EP.Admission_Date 
+2

我覺得你的子查詢應該還要篩選IP.Patient_Id = EP.Patient_Id - 應該解決您的問題1#。 – Anssssss

+2

您可能還會考慮重寫WHERE語句以使用適當的SARG進行日期過濾。 IP.Admission_Date> = DATEADD(天,-365,EP.Admission_Date)。這將有助於優化器在Admission_Date中選擇正確的索引。最後,如果出院日期和死亡的入院日期不一致,如果您的死亡日期是您的擔憂,您可能會轉爲EP的出院日期,那麼更多的商業相關信息。 –

+0

謝謝@Assssss。實際上,這解決了這兩個問題,但它給了我更多的問題。返回的結果是使一些計數加倍。我已經修改了子查詢SELECT到不同主鍵'SELECT COUNT(DISTINCT IP.Inpatient_Episode_Primary_Key)',但這沒什麼區別。 – Jon295087

回答

0

由於與他人討論,這裏的解決方案:

SELECT DISTINCT 
EP.Patient_Id 
,EP.Admission_Date 'Final Admission Date' 
,(
    SELECT COUNT(DISTINCT IP.Admission_Date) 
    FROM Inpatients.vw_IP_Episodes IP 
    WHERE IP.Admission_Date >= DATEADD(day, -365, EP.Admission_Date) 
    AND IP.Patient_Id = EP.Patient_Id 
    AND IP.Discharge_Method != 'Patient died' 
) 
AS 'No of Prior Admissions' 

FROM Inpatients.vw_IP_Episodes EP 
WHERE EP.Admission_Date BETWEEN '01/01/2016' AND '31/12/2016' 
AND EP.Discharge_Method = 'Patient died' 

GROUP BY EP.Patient_Id, EP.Admission_Date 
-1

CTE也許是最好的刪除重複。

;WITH cte AS(SELECT EP.Patient_Id 
     ,EP.Admission_Date 'Final Admission Date' 
     , ROW_NUMBER() OVER (PARTITION BY EP.Patient_Id ORDER BY EP.Admission_Date DESC) AS Rownum 
     , (SELECT COUNT(*) AS [No of Prior Admissions] 
       FROM Inpatients.vw_IP_Episodes IP 
       WHERE Admission_Date >= DATEADD(day, -365, EP.Admission_Date) 
       AND Admission_Date < EP.Admission_Date 
       AND IP.Patient_Id = EP.Patient_Id 
       ) [No of Prior Admissions] 
    FROM Inpatients.vw_IP_Episodes EP 
    WHERE EP.Admission_Date BETWEEN '01/01/2016' AND '31/12/2016' 
    AND EP.Discharge_Method = 'Patient died' 
) 

SELECT * 
FROM cte 
WHERE Rownum = 1; 
+0

嗨@ Wendy,恐怕這不會運行。 – Jon295087

+0

你有什麼錯誤信息? – Wendy

+0

'Msg 102,Level 15,State 1,Line 9 ')'附近的語法不正確。' – Jon295087

相關問題