Datum Unterschied zwischen aufeinanderfolgenden Zeilen - kompliziert

8

Ich hatte zuvor eine Frage gestellt, die beantwortet wurde, für die ich aber eine Abfrage benötige Das auch. Ich habe eine Tabellenstruktur mit Daten wie dieser (Daten im Format TT / MM / JJJJ ).

%Vor%

Im Grunde handelt es sich um eine Tabelle, in der die Patienten in eine bestimmte Station aufgenommen und zwischen den Stationen überwiesen und schließlich entweder am selben Tag oder wenige Tage später entlassen werden. Das erwartete Ergebnis der Abfrage wäre:

%Vor%

Das Entlassungsdatumsfeld wird nur gefüllt, wenn der Patient entlassen wird, daher möchte ich den Datumsunterschied zwischen jedem Datum der Bewegung des Patienten einschließlich der Aufnahme und dem Entlassungsdatum berechnen.

Ich benutze MS Access 2003.

Ich hoffe, dass jemand mir dabei helfen kann.

    
Mohammed Rishal 11.04.2012, 01:06
quelle

1 Antwort

5

Filtern der irrelevanten Daten

Bei jeder komplexen Abfrage baut ein Teil der Kunst die Abfrage Stück für Stück auf und testet so, wie Sie es tun.

Ich gehe davon aus, dass der Tabellenname PatientMovements ist und dass:

  

Vorgegebene Paare von Zeilen wie ID = {6,7} und ID = {8,9}, es ist richtig zu sagen, dass die Zeile, wo der Patient (Kontonummer), Einheit und Zulassung Datum mit Null-Entlassungsdatum wird ignoriert, wenn es auch einen Datensatz für den gleichen Patienten, die gleiche Einheit und das gleiche Zulassungsdatum gibt, aber ein Entlassungsdatum ungleich null.

Schritt eins besteht darin, die Zeilen zu erzeugen, an denen wir arbeiten müssen, und die irrelevanten Daten aus der in der Datenbank aufgezeichneten Tabelle herauszufiltern. Dies ist eine UNION von zwei Datensätzen:

  1. Diese Zeilen mit einem Nicht-Null-Entlassungsdatum.
  2. Diese Zeilen mit einem Null-Entlassungsdatum, aber keine Zeile für dasselbe Konto, dieselbe Einheit und dasselbe Aufnahmedatum.

Der erste Teil der UNION ist eindeutig:

%Vor%

Weniger offensichtlich ist der zweite Teil der UNION:

%Vor%

Nun können Sie diese zu einer einzigen Ergebnismenge kombinieren:

%Vor%

Sie können die obige Abfrage überprüfen, indem Sie überprüfen, ob Zeilen mit den IDs 1..5, 7 und 9 zurückgegeben werden.

Warnung: nicht getesteter Code. Keines der SQL in dieser Antwort war in der Nähe eines DBMS, daher wurde es nicht getestet.

Zuvor gelernte Lektionen anwenden

Und dann können Sie Ihr Lernen von der anderen Frage anwenden, um die Daten zu bestellen und berechnen Sie die Datumsunterschiede, etc. Die einzige Komplikation ist, dass Sie diese Abfrage zweimal schreiben müssen, was schmerzhaft ist (außer MS Access 2003 unterstützt die 'WITH'-Klausel oder den allgemeinen Tabellenausdruck).

  

Aber würde es keine einzelne Abfrage geben, um diese erforderliche Ausgabe zu erhalten?

Die UNION ist natürlich eine einzelne Abfrage. Ich nehme an, du könntest einfach schreiben:

%Vor%

Ich kann mir nicht sofort eine kompaktere Art der Abfrage vorstellen.

Die UNION in 'Die andere Antwort' bauen

Die akzeptierte Antwort auf die andere Frage hat zwei mögliche Lösungen (in der Fassung von Kommentaren und umformatiert):

%Vor%

Oder:

%Vor%

Wie in einem Kommentar erwähnt, führt das Fehlen des Tabellennamens in der Frage zu unterschiedlichen Tabellennamen, die in der Antwort erscheinen; Was ich Patient Movements nannte, wurde in dieser Antwort YourTable genannt. Der andere Unterschied besteht darin, dass die ursprüngliche Frage die Spalten "Unit" oder "DischargeDate" in den Daten nicht enthielt. Die UNION-Abfrage, die ich angegeben habe, gibt jedoch die relevanten Daten an, auf denen diese Abfragen ausgeführt werden sollen. Sie müssen lediglich die UNION-Abfrage in die anderen Antworten anstelle von YourTable schreiben. Dies führt zu:

%Vor%

Oder:

%Vor%

Also, solange Sie vorsichtig sind und Abfragen in Fragmenten entwickeln und diese dann konsistent kombinieren, kann die schrecklichste Abfrage gezähmt werden.

Gemeinsame Tabellenausdrücke

Beachten Sie, dass der SQL-Standard "allgemeine Tabellenausdrücke" (CTEs) hat, die als "WITH-Klauseln" bekannt sind und die Dinge noch einfacher machen können.

%Vor%

Oder:

%Vor%

Einer der Hauptvorteile der Verwendung eines CTE besteht darin, dass dem Optimierer explizit gesagt wird, dass die Tabellenausdrücke an allen Stellen, an denen er verwendet wird, gleich sind, während er beim mehrfachen Auszeichnen diese Gemeinsamkeit möglicherweise nicht erkennt. Außerdem führt das mehrfache Schreiben der Abfrage zu der Möglichkeit, dass die beiden Abfragen, die darauf ausgerichtet sind, die gleichen zu sein, aufgrund eines Bearbeitungsfehlers tatsächlich geringfügig voneinander abweichen. Diese Möglichkeit wird vom CTE ausgeschlossen. Der andere Vorteil im gegenwärtigen Kontext war, dass die Kombination des CTE mit den Lösungen für die andere Frage ein Kinderspiel war.

Leider ist es unwahrscheinlich, dass MS Access 2003 CTEs unterstützt. Ich teile deinen Schmerz; das DBMS, mit dem ich arbeite, funktioniert auch nicht.

    
Jonathan Leffler 11.04.2012 01:39
quelle

Tags und Links