我們需要了解患者在第一次住院後30天內重新入住的人數(以及是誰)。有多少患者在第一次住院後的30天內重新入院
表(非常簡化):patientID(int),DateInToHospital(datetime),DateOutOfHospital(Datetime)。
因此,我們需要所有的病人,其中DateInToHospital(第二支柱)< = DateOutOfHospital(第一支柱)起30天
(我們使用的MS SQL Server 2008 R2)
我們需要了解患者在第一次住院後30天內重新入住的人數(以及是誰)。有多少患者在第一次住院後的30天內重新入院
表(非常簡化):patientID(int),DateInToHospital(datetime),DateOutOfHospital(Datetime)。
因此,我們需要所有的病人,其中DateInToHospital(第二支柱)< = DateOutOfHospital(第一支柱)起30天
(我們使用的MS SQL Server 2008 R2)
這應該工作:
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) 必須重新檢查,然後再結束 –
這將返回一個病人誰被重新承認任何准入的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天,但在第二次入住後30天內重新入住。 –
@FredMortenSolbakken編輯爲包含'not exists()'子句以僅獲得第一個准入。 – SqlZim
您能否提供樣本數據? – Jake
這個數據很困難;我有幾次住宿的病人。 有些住宿在上次住宿結束的同一時間開始,所以它不是一個真正的新住宿。 到目前爲止喬爾的第二個解決方案與CROSS APPLY似乎給出了最正確的答案 –