Sql server 根据两个日期之间的差异计算记录数的SQL子查询

Sql server 根据两个日期之间的差异计算记录数的SQL子查询,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我正在查询一组在2016年1月1日至2016年12月31日期间入院并死亡的患者的结果 作为结果集的一部分,我需要包括“先前入院次数”一栏,该栏给出了截至最终入院日期的12个月内患者的所有先前入院总数 因此,如果患者于2016年6月1日入院并死亡,且在2015年7月1日和2015年9月30日之前有两次入院,则本栏中的总数为“2” 因此,逻辑需要是:如果患者在xx/xx/xxxx日期入院并死亡,则计算入院日期在xx/xx/xxxx后365天内的同一患者先前入院的次数 我曾尝试通过以下子查询进行此操作

我正在查询一组在2016年1月1日至2016年12月31日期间入院并死亡的患者的结果

作为结果集的一部分,我需要包括“先前入院次数”一栏,该栏给出了截至最终入院日期的12个月内患者的所有先前入院总数

因此,如果患者于2016年6月1日入院并死亡,且在2015年7月1日和2015年9月30日之前有两次入院,则本栏中的总数为“2”

因此,逻辑需要是:如果患者在xx/xx/xxxx日期入院并死亡,则计算入院日期在xx/xx/xxxx后365天内的同一患者先前入院的次数

我曾尝试通过以下子查询进行此操作,但遇到两个问题:

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

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;

感谢与其他人的讨论,以下是解决方案:

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

我认为您的子查询也应该对IP.PaultTyId= EP.PurtEntHyIDID进行过滤——这应该修复您的问题1。您也可以考虑改写您的WHERE语句,以便为您的日期筛选使用适当的SARG。IP.Admission\u Date>=DATEADDday,-365,EP.Admission\u Date。这将有助于优化器选择正确的索引(如果您在准入日期有任何索引)。最后,如果死亡的出院日期和入院日期不一样,如果您担心死亡日期,您可以切换到EP的出院日期。谢谢@anssss。实际上,这解决了这两个问题,尽管它给了我一个更进一步的问题。返回的结果是将某些计数加倍。我已将子查询SELECT修改为主键上的distinct SELECT COUNT distinct IP.INDUCTIONAL_SECTION_primary_key_,但这没有任何区别。谢谢@AnthonyHancock我已将优化代码应用于我的查询。是的,这是一个关于入院和出院日期之间潜在差异的有效观点。报告的重点是入院日期,而不是实际死亡日期,即使比入院日期晚了几天,所以这是我们的参考点。@Jon295087,不确定为什么会出现加倍……也许您可以通过查看子查询为特定EP.Patient_Id和EP.Acquisition_Date值查找的行来调试问题。另外,这也没什么大不了的,但我认为末尾的GROUP BY是不必要的,因为您在主查询中没有执行任何聚合函数-COUNT*在子查询中。您好@Wendy,恐怕这不会运行。Msg 102,级别15,状态1,第9行语法不正确。我已经在同一天编辑了查询。也没用?