[FIXED] SQL: Wert gleich der Differenz zwischen einer Spalte in dieser Zeile und einer anderen Spalte in der vorherigen Zeile

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.

Stundenzettel

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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like