我们需要了解在首次入住后30天内重新入院的患者人数(以及是谁)。
表格(非常简化):patientID(int),DateInToHospital(datetime),DateOutOfHospital(Datetime)。
所以我们需要所有患者,其中DateInToHospital(第二次入住)< = DateOutOfHospital(第一次入住)+ 30天
(我们使用MS SQL Server 2008 R2)
答案 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