2016-09-16 7 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 

が...私は私が使用すべきかのパーティションを考えていたが、すべての順位パーティションI:だから私は、これらの日はそう、出力ではなく、このようになります範囲崩壊したいと思います(rank/dense_rank)が最初の2つのER値に最後のER値と同じランクを割り当てることは間違っていると考えることができます。

基本的に、私の質問は、これは未解決の問題であると同じである:Collapsing date records only if the value doesn't change - Oracle SQL

私はネティーザを使用しています。

答えて

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

2つの質問: 1)パーティションのフィールドがtまたはtprevから来ていますか? 2)私は合計が何をしているのかよく分かりませんが、私は出力を見ることができますが、私は間違いなく混乱しています – user3642531

+0

フィールドは 't'のものです。 'tprev'は、フラグの情報を取得するためにのみ使用されます。 'sum()'は隣接する行にグループを割り当てるのに使われる累積合計です。値は、グループを呼び出すために一定でなければなりません。 –

+0

私はそれを今得ます。そして、それは動作します。ありがとう! – user3642531