有多少患者在首次入住后30天内重新入院

时间:2017-05-25 17:34:16

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

我们需要了解在首次入住后30天内重新入院的患者人数(以及是谁)。

表格(非常简化):patientID(int),DateInToHospital(datetime),DateOutOfHospital(Datetime)。

所以我们需要所有患者,其中DateInToHospital(第二次入住)< = DateOutOfHospital(第一次入住)+ 30天

(我们使用MS SQL Server 2008 R2)

2 个答案:

答案 0 :(得分:1)

这将返回先前承认在任何入学后30天内重新入院的患者:

select *
from p
where exists ( /* re-admit within 30 days */
  select 1
  from p i
  where i.PatientId = p.PatientId
    and i.AdmitDate > p.DischargeDate
    and i.AdmitDate <= dateadd(day,30,p.DischargeDate)
    )

这将返回在首次入院后30天内重新入院的患者的初次入院:

select *
from p
where exists ( /* re-admit within 30 days */
    select 1
    from p i
    where i.PatientId = p.PatientId
      and i.AdmitDate > p.DischargeDate
      and i.AdmitDate <= dateadd(day,30,p.DischargeDate)
      )
  and not exists ( /* only for the first admittance */
    select 1
    from p i
    where i.PatientId = p.PatientId
      and i.AdmitDate < p.AdmitDate
      )

答案 1 :(得分:0)

这应该有效:

WITH FirstAdmit AS (
    SELECT patientID, MIN(DateInToHospital) FirstStayStart
    FROM [Table]
), 
FirstDischarge AS (
     SELECT t.patientID, DateOutOfHospital, FirstStayStart
     FROM FirstAdmit a
     INNER JOIN [Table] t ON t.patientID = a.patientID AND t.DateInToHospital = a.FirstStayStart
)
SELECT t.*
FROM [Table] t
INNER JOIN FirstDischarge d on t.patientID = d.patientID 
    AND t.DateInToHospital <= DATEADD(d, 30, d.DateOutOfHospital) 
    AND t.DateInToHospital <> FirstStayStart

这是一个使用APPLY的版本可能会更快一点:

SELECT t.* 
FROM [Table] t
CROSS APPLY (
   SELECT TOP 1 DateInToHospital, DateOutOfHospital FROM [Table] m WHERE m.patientID = t.patientID ORDER BY DateInToHospital
) FirstStay
WHERE t.DateInToHospital <= DATEADD(d, 30, FirstStay.DateOutOfHospital)
    AND t.DateInToHospital <> FirstStay.DateInToHospital