2017-04-05 117 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

相关问题