2016-09-16 3 views
1

Ich habe einen Datensatz, der etwa wie folgt aussieht:Einstürzen Datumsbereiche in SQL (Netezza)

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 

Mein Ziel ist der Eintritt/Entlade-Daten für jede Einheit zu erhalten. Das Problem besteht darin, dass Patienten manchmal Betten in derselben Einheit wechseln, und diese Aktion wird als Übertragung bezeichnet, obwohl sich der Patient noch in derselben Einheit befindet. So würde Ich mag diejenigen Datum zusammenzubrechen reicht, so dass die Ausgabe sieht stattdessen wie folgt aus:

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 

Ich weiß nicht, wie dies zu erreichen ... Ich dachte an welche Partition ich verwenden sollte, aber jeder Rang Partition I kann sich vorstellen (rank/dose_rank) weist den ersten beiden ER-Werten den gleichen Rang zu wie dem letzten ER-Wert, was inkorrekt wäre.

Grundsätzlich meine Frage ist die gleiche diese ungelöste Frage: Collapsing date records only if the value doesn't change - Oracle SQL

Ich bin mit Netezza.

Antwort

1

Sie können left join verwenden, um festzustellen, ob etwas mit dem vorherigen Datensatz verbunden ist. Wenn keine Verbindung besteht, haben Sie den Beginn einer "kontinuierlichen Periode". Dann weist eine kumulative Summe eine Gruppierung zu, die zur Aggregation verwendet werden kann.

Das ist, wie diese Abfrage funktioniert:

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; 

Hinweis: Dies setzt voraus, dass das neue Aufnahmedatum ist genau die gleiche wie zuvor, Entlassungsdatum. Natürlich können Sie die Nicht-Gleichheitslogik einführen, wenn Sie überprüfen möchten, ob die Zulassung innerhalb von, sagen wir, 10 Sekunden oder 5 Minuten nach der Entladung stattgefunden hat.

+0

Zwei Fragen: 1) Sind die Felder in der Partition von t oder tprev? 2) Ich bin nicht ganz sicher, was die Summe tut, kann ich die Ausgabe sehen, aber ich bin zugegebenermaßen verwirrt – user3642531

+0

Die Felder sind von 't'; 'tprev' wird nur verwendet, um die Informationen für die Flagge zu erhalten. Die 'sum()' ist eine kumulative Summe, die verwendet wird, um eine Gruppe benachbarten Reihen zuzuweisen. Der Wert sollte für das, was Sie eine Gruppe nennen möchten, konstant sein. –

+0

Ich verstehe es jetzt. Und es funktioniert. Vielen Dank! – user3642531