Ausgabe
Ich habe einen Stundenzettel-Datensatz, für den ich nur die Startzeit der ersten von mehreren Aktivitäten für einen Mitarbeiter an einem Tag habe, aber ich habe die Anzahl der Minuten, die für jede der Aktivitäten aufgewendet wurden. Ich möchte einen Datensatz generieren, der Start- und Endzeiten für alle Aktivitäten enthält.
Die Startzeit in Zeile zwei muss also = Endzeit in Zeile eins sein. Die Endzeit in Reihe zwei muss die neu berechnete Startzeit für Reihe zwei + Minuten in Reihe zwei sein und so weiter für die restlichen Reihen. Ich habe versucht, mich mit derselben Tabelle auf t1.ActivityOrder = t2.ActivityOrder + 1 zu verbinden, aber das hat nicht funktioniert.
Wie kann ich das machen?
Lösung
Da es keinen Unterschied zwischen der Endzeit des vorherigen und der Startzeit des aktuellen gibt, müssen Sie nur die Startzeit der Aufgabenreihenfolge 1 und die kumulative Dauer kennen
zum Beispiel gegeben
create table t
(id int,startdt smalldatetime, enddt smalldatetime, duration int, taskorder int);
insert into t values
(1,'2022-10-06 07:00:00',null, 20,1),
(2,null,null, 10,2),(3,null,null, 10,3),(4,null,null, 10,4)
select id,
case when startdt is null then
dateadd(minute,sum(duration) over (order by taskorder ROWS BETWEEN UNBOUNDED PRECEDING AND 1 preceding ) ,
(select startdt from t t1 where t1.taskorder = 1))
else startdt
end startdt,
case when enddt is null then
dateadd(minute,sum(duration) over(order by taskorder),
(select startdt from t t1 where t1.taskorder = 1))
end enddt,
duration,
taskorder,
sum(duration) over (order by taskorder) sumtask,
sum(duration) over (order by taskorder ROWS BETWEEN UNBOUNDED PRECEDING AND 1 preceding ) sumprecd
from t
id startdt enddt duration taskorder sumtask sumprecd
----------- ----------------------- ----------------------- ----------- ----------- ----------- -----------
1 2022-10-06 07:00:00 2022-10-06 07:20:00 20 1 20 NULL
2 2022-10-06 07:20:00 2022-10-06 07:30:00 10 2 30 20
3 2022-10-06 07:30:00 2022-10-06 07:40:00 10 3 40 30
4 2022-10-06 07:40:00 2022-10-06 07:50:00 10 4 50 40
(4 row(s) affected)
Beantwortet von – P. Salmon
Antwort geprüft von – Clifford M. (FixError Volunteer)