【问题标题】:How many patients has been readmitted within 30 days from their first stay有多少患者在首次住院后 30 天内再次入院
【发布时间】:2017-05-25 17:34:15
【问题描述】:

我们需要了解有多少(以及是谁)在首次住院后 30 天内重新入院。

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

所以我们需要 DateInToHospital(第二次住院)

(我们使用 MS SQL Server 2008 R2)

【问题讨论】:

  • 你能提供样本数据吗?
  • 这一项中的难点数据;我有病人住过几次。一些住宿开始与最后一次住宿同时结束,所以这并不是一个真正的新住宿。到目前为止,Joel 使用 CROSS APPLY 的第二个解决方案似乎给出了最正确的答案

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


【解决方案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
      )

【讨论】:

  • 抱歉,我有两名患者再次入院 > 30 天,但在第二次住院
  • @FredMortenSolbakken 编辑为包含 not exists() 子句,仅获得第一个准入。
【解决方案2】:

这应该可行:

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

【讨论】:

  • 两者似乎都有效(在解决方案 1 中的第三行之后添加 GROUP BY PatientID 之后)在我得出结论之前必须仔细检查
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 2021-02-13
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多