2016-09-16 117 views
1

我有一個數據集,看起來是這樣的:摺疊日期範圍

Visit ID Admission Date  Discharge Date  Unit 
20   01/01/2015 12:45  01/01/2015 13:57  ER 
20   01/03/2015 13:57  01/04/2015 11:57  ER 
20   01/04/2015 11:57  01/04/2015 19:32  Trauma 
20   01/04/2015 19:32  01/04/2015 21:22  ER 

我的目標是讓每個單元入院/出院日期。問題在於,有時患者在同一單元內換牀,即使患者仍在同一單元內,該操作也被標記爲轉移。所以,我想那些倒塌日期範圍使輸出,而不是像這樣:

Visit ID Admission Date  Discharge Date  Unit 
20   01/01/2015 12:45  01/01/2015 11:57  ER 
20   01/04/2015 11:57  01/04/2015 19:32  Trauma 
20   01/04/2015 19:32  01/04/2015 21:22  ER 

我不知道如何做到這一點...我想我應該用什麼分區,但每個分區的排名我可以認爲(rank/dense_rank)會將前兩個ER值分配到與最後一個ER值相同的等級,這將是不正確的。

基本上,我的問題是一樣的,這是沒有答案的問題:Collapsing date records only if the value doesn't change - Oracle SQL

我使用的是Netezza公司。

回答

1

您可以使用left join來查看是否有東西連接到上一條記錄。如果沒有聯繫,那麼你有一個「連續期」的開始。然後,累計和分配一個分組,可用於聚合。

也就是說這個查詢是如何工作的:

select visitid, unit, 
     min(admissiondate) as admissiondate, 
     max(dischargedate) as dischargedate 
from (select t.*, 
      sum(case when tprev.visitid is null then 1 else 0 end) over 
       (partition by t.visitid, t.unit order by t.admissiondate 
       ) as grp 
     from t left join 
      t tprev 
      on t.visitid = tprev.visitid and t.unit = tprev.unit and 
       t.admissiondate = tprev.dischargedate 
    ) t 
group by grp, visitid, unit; 

注:這假定新入院日期是完全一樣的前一出院日期。當然,如果你想檢查入場是否在10秒或5分鐘內出現,你可以引入非平等邏輯。

+0

有兩個問題: 1)分區中的字段是來自t還是tprev? 2)我不太確定這個總和在做什麼,我可以看到輸出結果,但我承認很困惑 – user3642531

+0

這些字段來自't'; 'tprev'僅用於獲取標誌的信息。 sum()是一個累計和,用於將一個組分配給相鄰的行。對於您想要調用組的值,該值應該保持不變。 –

+0

我現在明白了。它的工作原理。謝謝! – user3642531