Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
WITH tabelle(Personalnr,von,bis) AS (
SELECT 11917,convert(DATE,'2024-03-18',23),convert(DATE,'2025-06-17',23) UNION ALL
SELECT 11917,'2023-09-13','2023-12-12' UNION ALL
SELECT 11917,'2022-06-13','2022-09-12' UNION ALL
SELECT 11917,'2021-12-07','2022-03-06' UNION ALL
SELECT 11917,'2021-04-01','2021-12-06' UNION ALL
SELECT 11917,'2020-09-07','2020-03-31' UNION ALL
SELECT 11917,'2020-03-03','2020-06-01' UNION ALL
SELECT 11917,'2020-01-31','2020-03-02' UNION ALL
SELECT 11917,'2020-01-28','2020-01-30' UNION ALL
SELECT 11917,'2019-03-04','2020-01-27' UNION ALL
SELECT 11917,'2018-12-03','2019-03-03'
)
SELECT Personalnr,
sum_unterbrechung,
min(von) AS min_von,
max(bis) AS min_bis
FROM (
SELECT *,
sum(unterbrechung) OVER (PARTITION BY Personalnr ORDER BY von) AS sum_unterbrechung
FROM (
SELECT *,
-- lag(bis) OVER (PARTITION BY Personalnr ORDER BY von) AS lagbis,
( CASE WHEN dateadd(month,3,lag(bis) OVER (PARTITION BY Personalnr ORDER BY von)) <= von THEN 1 ELSE 0 END ) AS unterbrechung
FROM tabelle
) t1
) t2
GROUP BY Personalnr,sum_unterbrechung
ORDER BY Personalnr,sum_unterbrechung DESC
SELECT t3.personalnr,
t3.kundennr,
t3.sum_unterbrechung,
min(t3.datumvon) AS min_von,
max(t3.datumbis) AS min_bis
FROM
(
SELECT t2.personalnr, t2.kundennr, t2.datumvon, t2.datumbis, sum(t2.unterbrechung) OVER (PARTITION BY t2.personalnr, t2.kundennr ORDER BY t2.datumvon, t2.kundennr) AS sum_unterbrechung
FROM (
select ep.personalnr, k.kundennr, ep.datumvon, ep.datumbis, CASE WHEN cast(lag(ep.datumvon) OVER (PARTITION BY ep.personalnr, k.kundennr ORDER BY ep.datumvon, k.kundennr) as date) + interval '3 Month' <= cast(ep.datumvon as date) THEN 1 ELSE 0 END AS unterbrechung
from einspers ep
inner join auftrag a on ep.auftragnr = a.auftragnr
inner join kunden k on k.kundennr = a.kundennr
) t2
) t3
where t3.personalnr = 11917 and t3.kundennr = 143441
GROUP BY t3.personalnr, t3.kundennr, t3.sum_unterbrechung
ORDER BY t3.personalnr, t3.kundennr, t3.sum_unterbrechung desc
oh man ist das peinlich, sorry....Probiers mal mit ep.datumbis
einsatzvon | einsatzbis | stufe |
---|---|---|
2018-12-03 | 2020-01-27 | 2019-01-14 |
2018-12-03 | 2020-01-27 | 2019-03-03 |
2018-12-03 | 2020-01-27 | 2019-05-03 |
2018-12-03 | 2020-01-27 | 2019-07-03 |
2018-12-03 | 2020-01-27 | 2019-09-03 |
2018-12-03 | 2020-01-27 | 2020-03-03 |
einsatzvon | einsatzbis |
---|---|
2018-12-03 | 2019-01-13 |
2019-01-14 | 2019-03-02 |
2019-03-03 | 2019-05-02 |
2019-05-03 | 2019-07-02 |
2019-07-03 | 2019-09-02 |
2019-09-03 | 2020-01-27 |
personalnr | kundennr | einsatzvon | einsatzbis |
11917 | 143441 | 2018-12-03 | 2019-01-14 |
11917 | 143441 | 2019-01-15 | 2019-03-02 |
11917 | 143441 | 2019-03-03 | 2019-05-02 |
11917 | 143441 | 2019-05-03 | 2019-07-02 |
11917 | 143441 | 2019-07-03 | 2019-09-02 |
11917 | 143441 | 2019-09-03 | 2020-01-27 |
11917 | 143441 | 2020-01-28 | 2020-03-30 |
11917 | 143441 | 2020-01-31 | 2020-03-02 |
11917 | 143441 | 2020-03-03 | 2020-06-01 |
11917 | 143441 | 2020-09-07 | 2020-10-18 |
11917 | 143441 | 2020-10-19 | 2020-12-06 |
11917 | 143441 | 2020-12-07 | 2021-02-06 |
11917 | 143441 | 2021-02-07 | 2021-03-31 |
11917 | 143441 | 2021-04-01 | 2021-04-06 |
11917 | 143441 | 2021-04-07 | 2021-06-06 |
11917 | 143441 | 2021-06-07 | 2021-12-06 |
11917 | 143441 | 2021-12-07 | 2022-03-06 |
11917 | 143441 | 2022-06-13 | 2022-07-24 |
11917 | 143441 | 2022-07-25 | 2022-09-12 |
11917 | 143441 | 2022-09-13 | 2022-11-12 |
11917 | 143441 | 2022-11-13 | 2023-03-12 |
11917 | 143441 | 2023-03-13 | 2023-09-12 |
11917 | 143441 | 2023-09-13 | 2023-12-12 |
11917 | 143441 | 2024-03-18 | 2024-04-28 |
11917 | 143441 | 2024-04-29 | 2024-06-17 |
11917 | 143441 | 2024-06-18 | 2024-08-17 |
11917 | 143441 | 2024-08-18 | 2024-10-17 |
11917 | 143441 | 2024-10-18 | 2024-12-17 |
11917 | 143441 | 2024-12-18 | 2025-06-17 |
Personalnummer | Kundennummer | Phase von | Phasebis |
---|---|---|---|
11917 | 143441 | 2018-12-03 | 2019-01-13 |
11917 | 143441 | 2019-01-14 | 2019-03-03 |
11917 | 143441 | 2019-03-04 | 2019-03-31 |
11917 | 143441 | 2019-04-01 | 2019-05-02 |
11917 | 143441 | 2019-05-03 | 2019-07-02 |
11917 | 143441 | 2019-07-03 | 2019-09-02 |
11917 | 143441 | 2019-09-03 | 2020-01-27 |
Ein Mitarbeiter ist in einem Kunden im Einsatz. Dieser Einsatz kann eine lange Zeit dauern. In dieser Zeit können sich viele Dinge ändern, zum Beispiel refvon und refbis, evon und ebis, ebvon und ebbis, mvon und mbis, ivon und ibis, uvon und ubis, tvon und tbis sowie eine neue stufe mit stufevon.Wenn ich die Datensätze zu den ersten beiden genannten Fällen betrachte dann interessieren mich erstmal nur die Spalten
personalnr,kundenkr,einsatzvon,einsatzbis
die bilden zusammen eine Gruppe und werden unterbrochen von
tvon/tbis
was wiederrum unterbrochen wird von
stufevon
und zwar in dieser Hirachie. Es ist gegeben, das stufevon immer zwischen tvon/tbis liegt und tvon/tbis immer zwischen einsatzvon/einsatzbis. Das würde ich zumindest erwarten, ist aber nicht so. Warum liegt tvon/tbis mal innerhalb, mal außerhalb des Bereichs von einsatzvon/einsatzbis? Wer ist hier von wem abhängig?
Bei folgenden Spalten ist es sicher, dass das Ende, auch gleichzeitig einen Tag später ein neuer Anfang ist:Die Unterbrechung stufevon ist relativ einfach, weil keine Spalte stufebis gegeben ist. stufebis kann quasi abgeleitet werden vom nächsten Datensatz über eine Window-Funktion. Ist denn bei tvon/tbis das tbis relevant, also kann tbis mehr als einen Tag von tvon des nächsten Datensatzes abweichen? Ich gehe mal von nein aus, da es in den beiden betrachteten Fällen nicht so ist.
Exakt, ich habe hier nicht den Lösungsansatz von #17 genommen. Ich hatte bei der ursprünglichen Frage leider nicht berücksichtigt, dass ich später weitere Datumsfelder benötige - die ursprüngliche Anforderung war anders.Was eine mögliche Lösung der Aufgabe angeht würde ich erstmal fest halten das diese nichts mit der Lösung aus #17 zu tun hat. Ich weiß jetzt nicht genau ob du den Schritt in #17 vorher machst, ich gehe davon aus das die Tabelle test dein Datenbestand ist. Wenn das vorher schon berechnet wird, wäre eventuell ein ganz anderer Ansatz zielführender.
WITH t1 AS (
SELECT personalnr,
kundennr,
einsatzvon,
einsatzbis,
einsatzvon AS eventdate,
'einsatzvon' AS eventtype
FROM test
UNION ALL
SELECT personalnr,
kundennr,
einsatzvon,
einsatzbis,
einsatzbis AS eventdate,
'einsatzbis' AS eventtype
FROM test
UNION ALL
SELECT personalnr,
kundennr,
einsatzvon,
einsatzbis,
tvon AS eventdate,
'tvon' AS eventtype
FROM test
WHERE tvon IS NOT NULL
UNION ALL
SELECT personalnr,
kundennr,
einsatzvon,
einsatzbis,
stufevon,
'stufevon'
FROM test
WHERE stufevon IS NOT NULL
), t2 AS (
SELECT DISTINCT *
FROM t1
WHERE eventdate >= einsatzvon
AND eventdate < einsatzbis
)
SELECT personalnr,
kundennr,
einsatzvon,
einsatzbis,
eventtype AS phasegrund,
eventdate AS phasevon,
isnull(
dateadd(day,-1,
lead(eventdate) OVER (PARTITION BY personalnr,kundennr,einsatzvon,einsatzbis ORDER BY eventdate)
)
,einsatzbis) AS phasebis
FROM t2
ORDER BY personalnr,kundennr,einsatzvon,einsatzbis,eventdate