Wert des Datensatzes "davor" ermitteln

cat_sql

Benutzer
Beiträge
5
Hallo,

ich habe eine Tabelle mit vielen Logeinträgen und bräuchte zu jedem Logeintrag zusätzlich die Info zum Eintrag davor (um zu ermitteln, wie viele Datensätze in dem Zeitraum entstanden sind).

Meine Tabelle sieht vereinfacht so aus:

Code:
LfdNr    Beschreibung    Startzeit           Endzeit
1        Job1            02.05.2023 06:00    02.05.2023 06:02
2        Job2            02.05.2023 10:00    02.05.2023 10:05
7        Job4            02.05.2023 14:00    02.05.2023 14:03
8        Job7            02.05.2023 18:00    02.05.2023 18:07
9        Job1            03.05.2023 08:00    03.05.2023 08:05
11       Job2            03.05.2023 11:00    03.05.2023 11:05
14       Job4            03.05.2023 15:00    03.05.2023 15:07
21       Job7            03.05.2023 19:00    03.05.2023 19:02
28       Job1            04.05.2023 06:00    04.05.2023 06:05
36       Job2            04.05.2023 09:00    04.05.2023 09:07

Und als Ergebnis hätte ich gerne:
Code:
LfdNr    Beschreibung    Startzeit           Endzeit             LetzteStartzeit     LetzteEndzeit
1        Job1            02.05.2023 06:00    02.05.2023 06:02    NULL                NULL
2        Job2            02.05.2023 10:00    02.05.2023 10:05    02.05.2023 06:00    02.05.2023 06:02
7        Job4            02.05.2023 14:00    02.05.2023 14:03    02.05.2023 10:00    02.05.2023 10:05
8        Job7            02.05.2023 18:00    02.05.2023 18:07    02.05.2023 14:00    02.05.2023 14:03
9        Job1            03.05.2023 08:00    03.05.2023 08:05    02.05.2023 18:00    02.05.2023 18:07
11       Job2            03.05.2023 11:00    03.05.2023 11:05    03.05.2023 08:00    03.05.2023 08:05
14       Job4            03.05.2023 15:00    03.05.2023 15:07    03.05.2023 11:00    03.05.2023 11:05
21       Job7            03.05.2023 19:00    03.05.2023 19:02    03.05.2023 15:00    03.05.2023 15:07
28       Job1            04.05.2023 06:00    04.05.2023 06:05    03.05.2023 19:00    03.05.2023 19:02
36       Job2            04.05.2023 09:00    04.05.2023 09:07    04.05.2023 06:00    04.05.2023 06:05

Jetzt bekomme ich das zwar mit Unterabfragen gelöst, es sieht aber irgendwie nach keiner sehr "schönen" Lösung aus und ich frage mich, ob es dazu auch noch einen anderen Ansatz gibt.

SQL:
SELECT LfdNr, Beschreibung, Startzeit, Endzeit
     , (SELECT TOP 1 Startzeit
        FROM Protokoll p1
        WHERE p1.Beschreibung IN ('Job1', 'Job2', 'Job4', 'Job7')
              AND p1.Startzeit < p.Startzeit
        ORDER BY p1.Startzeit DESC)
     , (SELECT TOP 1 Endzeit
        FROM Protokoll p1
        WHERE p1.Beschreibung IN ('Job1', 'Job2', 'Job4', 'Job7')
             AND p1.Endzeit < p.Endzeit
        ORDER BY p1.Endzeit DESC)
FROM Protokoll p
WHERE Beschreibung IN ('Job1', 'Job2', 'Job4', 'Job7')


Vielen Dank schon mal.
 
Werbung:
Deine "Lösung" wird gar nicht mal so schnell sein ;-)

Du suchst eine Window-Function wie lag() oder lead(). Außerdem wundere ich mich etwas über deine Sortierung und die Jobs werden bei dir auch "durcheinander" aufgereiht, eventuell liegt da noch ein Logik Fehler vor.
Code:
SELECT LfdNr, Beschreibung, Startzeit, Endzeit,
lag(Startzeit) OVER (ORDER BY Startzeit DESC) AS lag_startzeit,
lag(Endzeit) OVER (ORDER BY Endzeit DESC) AS lag_endzeit,
FROM Protokoll p
WHERE Beschreibung IN ('Job1', 'Job2', 'Job4', 'Job7')
Eventuell macht eine Sortierung nach LfdNr oder zumindest in beiden Fällen nach Startzeit Sinn, sonst kann das mal unerwartet werden wenn Jobs sich schneiden, dann ist die lag_startzeit nicht vom selben Datensatz wie die lag_endzeit. Auch kann PARTION BY Beschreibung sinnvoll sein, dann wird jeder Job für sich betrachtet.
 
Aufgrund der Performance eben mein Gefühl mit "nicht so schön". ;-)

Die Jobs sind deshalb "durcheinander", weil es einfach eine Bezeichnung des Jobs ist der eben täglich einmal ausgeführt wird - sortiert wäre jetzt nach Startzeit bzw. bei der Ermittlung der letzten Werte Start- und Endzeit, LfdNr funktioniert aber genauso.
Es darf eben nicht jeder Job einzeln betrachtet werden, sondern die Jobs 1, 2, 4 und 7 gemeinsam.

Vielen Dank für deinen Input bezüglich lag() und lead() - die beiden Funktionen kannte ich noch nicht und werde ich mir einmal ansehen.
 
Zuletzt bearbeitet:
Werbung:
War kein Problem, weil ich es sowieso an meine Tabelle angepasst habe. Danke.

Und der Vollständigkeiten wegen:
Die Sortierung habe ich auf die LfdNr umgestellt und dann muss sie aufsteigend sein, damit der korrekte Datensatz davor ausgewertet wird.

SQL:
SELECT LfdNr, Beschreibung, Startzeit, Endzeit,
lag(Startzeit) OVER (ORDER BY LfdNr) AS lag_startzeit,
lag(Endzeit) OVER (ORDER BY LfdNr) AS lag_endzeit
FROM Protokoll p
WHERE Beschreibung IN ('Job1', 'Job2', 'Job4', 'Job7')

Und ja, es geht jetzt deutlich schneller. :) Danke nochmal.
 
Zurück
Oben