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

时间:2017-04-05 15:25:26

标签: sql-server sql-server-2008 tsql

我查询了在2016年1月1日至2016年12月31日期间入院的患者结果,并且已经死亡。

作为结果集的一部分,我需要添加一个专栏('预先录取次数'),该列提供患者在截至该日期的12个月内的所有先前录取他们最后的录取。

因此,如果患者于2016年6月1日入院并去世,并且在2015年7月1日和2015年9月30日有2次入院,那么总数将是' 2'在这一栏中。

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

我尝试将此作为以下子查询,但得到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 个答案:

答案 0 :(得分: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 :(得分:-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;