ukulele
Datenbank-Guru
- Beiträge
- 5.321
Diese Annahme von mir ist in deinen Beispieldaten nicht gegeben. taetigkeiten.id zählt zwar hoch, fängt aber nicht beim selben Wert an und für taetigkeiten.status_id = 99 findet auch in taetigkeiten.id ein unkalkulierbarer "Sprung" statt. taetigkeiten.status_id zählt auch nicht hoch, das ist nur der Fremdschlüssel auf status und wechselt dementsprechend.Also du hast eine Reihe von Zeitpunkten und die Zwischenräume sind deine Tätigkeiten. Die erste Buchung ist Status 1, Folgebuchungen zählen den Status hoch, die letzte ist immer Status 99. Kann man machen, daraus muss man sich dann die Zeiträume generieren, die kann man dann im zweiten Schritt aggregieren.
In der Folge gibt es keinen Wert der zusammenhängend eine Reihenfolge bildet. Und damit kannst du meinen ersten Code total vergessen - kann nicht funktionieren. Das muss auch nicht, dafür gibt es ja Window-Functions, mit denen man Daten in Reihenfolge bringen kann.
Ich frage nochmal, wieso nicht? MySQL unterstützt das schon seit einigen Versionen.Window-Funktionen habe ich nicht zur Verfügung (LAG).
Ohne Window-Functions wird das echt nicht schön. Man müsste es mit einem Subselect lösen, der kostet Performance. Hier mal ein Beispiel:
Code:
SELECT tt.mitarbeiter_id,
convert(DATE,tt.[time]) AS datum,
tt.statiname,
sum(datediff(minute,tt.[time],tt.time_bis)) AS sum_dauer
FROM (
SELECT taetigkeiten.*,
stati.statiname,
stati.farbe,
( SELECT TOP 1 t.[time]
FROM taetigkeiten t
WHERE t.mitarbeiter_id = taetigkeiten.mitarbeiter_id
AND ( t.[time] > taetigkeiten.[time]
OR t.[time] = taetigkeiten.[time]
AND t.stati_id = 99 )
ORDER BY t.[time] ASC
--LIMIT 1
) AS time_bis
FROM taetigkeiten
INNER JOIN stati
ON taetigkeiten.stati_id = stati.id
WHERE taetigkeiten.stati_id != 99
) tt
GROUP BY tt.mitarbeiter_id,convert(DATE,tt.[time]),tt.statiname
ORDER BY tt.mitarbeiter_id,convert(DATE,tt.[time]),tt.statiname
mitarbeiter_id datum statiname sum_dauer
-------------- ---------- ---------- -----------
1 2024-01-05 Büro 435
1 2024-01-05 Fahrt 30
1 2024-01-05 Kunde 105
2 2024-01-05 Büro 495
2 2024-01-05 Fahrt 45
2 2024-01-05 Kunde 0
2 2024-01-05 Pause 60
In deinen Daten gibt es auch noch eine Ungereimtheit. Mitarbeiter 2 hat um 17 Uhr Büro gestempelt und feierabend ist auch 17 Uhr. Ist das richtig? - Ich habe den Fall berücksichtigt, das ist die Position Kunde = 0 Minuten.