2012-08-06 340 views
0

內的所有DATEDIFFs我有一個像enter image description here查找特定時間範圍

一張桌子的patientid, admissiondate, dischargedate複合鍵。

請注意,patientID 6有10/21的dischargedate和10/22的admissiondate

另外patientID 11具有2/20的dischargedate和6/14的admissiondate

patientID可以在數據庫中的次數沒有限制。

如何獲得所有admissiondate比前面的dischargedate大3天或更少的天數的列表? (patientid 6符合此法案)。它不能正確地自我加入多次。我有

select patientid, p.admissiondate, p.dischargedate 
    from Patient as p 
    where patientid in 
    (
     select patientid 
      from Patient p2 
      group by patientid 
      having count(*) > 1 
    ) 
    order by patientid, admissiondate 

獲取所有人多次看到的列表。我如何確定admissionDatedischargedate之後的三天內? (從本例中的前一行開始)。

我不能做一個簡單的datediff(dd,admissiondate, dischargedate)因爲我不擔心datediff上的任何一個訪問,只是,在未來admissiondate內以前dischargedate

回答

4
;with cte as 
(
    -- get admission dates by patient in order 
select *, ROW_NUMBER() over (partition by PatientID order by AdmissionDate) as AdOrd 
from patient 
) 
    -- find the gaps between adjacent admissions 
    select admissions.patientid, discharges.dischargedate, admissions.admissiondate  
    from cte admissions 
     inner join cte discharges on discharges.patientid=admissions.patientid 
      and discharges.AdOrd = admissions.AdOrd-1 
    where DATEDIFF(D,discharges.dischargedate,admissions.admissiondate)<=3 
+0

這看起來像它的工作原理三天來一次。你能解釋一下嗎?和c2.AdOrd = c1.AdOrd-1'。 -1提供了什麼? – wootscootinboogie 2012-08-06 15:35:22

+3

既然'AdOrd'是基於你的'AdmissionDate'的順序,這個條件滿足你的要求,你只想比較'...以前的dischargeate' – 2012-08-06 15:41:28

+0

我不完全理解加入上一行數與平等的入場。 – wootscootinboogie 2012-08-06 15:45:16