SQL, um die verstrichene Zeit aus mehreren überlappenden Intervallen zu finden

8

Keine Verwendung von MSSQL oder DB2 oder Oracle. Kein CTE. Kein OVERLAP-Prädikat. Kein INTERVAL-Datentyp. Die Situation: An einem zu reparierenden Fahrzeug kann die Arbeit erst beginnen Alle für den Auftrag bestellten Teile wurden erhalten. Teile können vor Beginn der Reparatur mehrfach bestellt werden. Wir müssen die Zeit extrahieren, für die das Fahrzeug auf "Teile halten" war.

Also für ein Fahrzeug mit der ID = 1 Teile wurden bestellt (d1) und erhalten (d2) bei 4 verschiedenen Gelegenheiten

%Vor%

Wie oben zu sehen, war die Wartezeit bis zum Beginn der Arbeit (angenommen 8/1 als Datum, von dem das Fahrzeug zur Arbeit zur Verfügung stand) war 13 Tage. Die tatsächliche Zeit für das Warten auf Teile betrug 11 Tage, also die Anzahl Wir müssen von den Daten ableiten. Die tatsächlichen Datetime-Daten werden Zeitstempel sein, aus denen wir Stunden extrahieren, Wir haben Daten in diesen Beispieldaten zur Vereinfachung der Darstellung verwendet. Wir haben Schwierigkeiten, eine auf dem Set basierende (nicht psm, nicht udf, nicht cursor) basierte Lösung zu erstellen. TIA

    
jon 28.08.2011, 23:45
quelle

3 Antworten

4

Diese SQL-Anweisung scheint das zu bekommen, was Sie wollen (t ist der Tabellenname der Tabelle):

%Vor%

Die äußere Abfrage erhält die Dauer der Reparatur. Die komplexe Unterabfrage berechnet die Gesamtzahl der Tage, die nicht auf Teile warten. Dazu werden die Startdaten gesucht, an denen das Fahrzeug nicht auf Teile wartet, und dann die Anzahl der Tage gezählt, bis es erneut auf Teile wartet:

%Vor%

// 2) Die Tage, an denen das Fahrzeug nicht auf ein Teil wartet, ist das Datum aus der obigen Abfrage, bis das Fahrzeug // erneut auf ein Teil wartet.

%Vor%

Die Kombination der beiden oben genannten und die Zusammenfassung aller solcher Perioden ergibt die Anzahl der Tage, an denen das Fahrzeug nicht auf Teile wartet. Die letzte Abfrage fügt eine zusätzliche Bedingung hinzu, um das Ergebnis für jede ID aus der äußeren Abfrage zu berechnen.

Dies ist wahrscheinlich nicht sehr effizient auf sehr großen Tisch mit vielen IDs. Es sollte in Ordnung sein, wenn die ID auf einen oder nur wenige beschränkt ist.

    
Alex W 30.08.2011, 21:33
quelle
5

Ich konnte nicht erreichen, dass die Anfragen von @Alex W funktionieren. Es ist kein Standard-SQL, daher musste viel neu geschrieben werden, um mit SQL Server kompatibel zu sein (was ich testen kann). Aber es hat mir etwas Inspiration gegeben, die ich erweitert habe.

Finde alle Startpunkte jeder ununterbrochenen Wartezeit:

%Vor%

Und das Äquivalent für Endpunkte:

%Vor%

n ist die Anzahl der Tage seit einem bestimmten Zeitpunkt. Startpunkte haben einen negativen Wert und Endpunkte haben einen positiven Wert. Dies ist so, dass wir sie addieren können, um die Anzahl der Tage dazwischen zu erhalten.

%Vor%

Schließlich müssen wir nur Dinge hinzufügen:

%Vor%

Eingabetabelle (Bestellungen):

%Vor%

Ausgabe:

%Vor%

Alternativ können Sie dies mit einer gespeicherten Prozedur tun.

%Vor%

Rufen Sie es mit:

auf %Vor%     
Markus Jarderot 29.08.2011 06:28
quelle
0
%Vor%     
Tohid Moazami 08.12.2014 10:04
quelle

Tags und Links