MSSQL Werte verschiedener Zeilen addieren/vergleichen

CO@CO

Neuer Benutzer
Beiträge
4
Hallo,

sitz gerade vor einer Terminplananwendung u hab ein kleines Problem:
upload_2016-2-5_8-25-36.png

Es geht darum den nächsten freien Termin(Dauer bsp 15 min) zu finden, also Pat_bestellt + Dauer mit der nächsten Zeile Pat_bestellt zu vergleichen, ob dort 15 Minuten Differenz vorhanden sind. Habe mehrere Ansätze probiert, aber ich glaub ich sehe momentan den Wald vor lauter Bäumen nicht mehr....

Danke.
Gruss Christian
 

Anhänge

  • upload_2016-2-5_8-25-12.png
    upload_2016-2-5_8-25-12.png
    111 KB · Aufrufe: 2
Werbung:
Window-Funktionen sind Dein Freund. Hier z.B. die lag() - Funktion, mit der Du den Wert einer Zeile vorher holen und mit einem Wert der aktuellen Zeile verbinden kann - also z.B. die Differenz berechnen oder so.
 
Hallo,

danke für die Antwort. Das käme schon hin, kann es sein dass lag erst ab SQL 2012 mgl ist? Nutze einen 2008R2 derzeit...
 
Die Features einzelner M$SQL-Versionen kenne ich nicht. In PostgreSQL ist es seit 8.4 drin, was mittlerweile bereits nicht mehr supportet ist - also schon seeeeehr lange.
 
Um es mal grob zu zeigen:

Code:
test=*# select * from zeiten;
 id |  ts  | dauer
----+---------------------+-------
  1 | 2016-02-05 10:00:00 |  10
  2 | 2016-02-05 11:00:00 |  30
  3 | 2016-02-05 11:45:00 |  20
(3 rows)

test=*# select *, lag(ts + dauer * '1 Minute'::interval) over (order by ts) as endzeit from zeiten;
 id |  ts  | dauer |  endzeit
----+---------------------+-------+---------------------
  1 | 2016-02-05 10:00:00 |  10 |
  2 | 2016-02-05 11:00:00 |  30 | 2016-02-05 10:10:00
  3 | 2016-02-05 11:45:00 |  20 | 2016-02-05 11:30:00
(3 rows)

test=*# select ts - endzeit as freizeit, * from (select *, lag(ts + dauer * '1 Minute'::interval) over (order by ts) as endzeit from zeiten) foo;
 freizeit | id |  ts  | dauer |  endzeit
----------+----+---------------------+-------+---------------------
  |  1 | 2016-02-05 10:00:00 |  10 |
 00:50:00 |  2 | 2016-02-05 11:00:00 |  30 | 2016-02-05 10:10:00
 00:15:00 |  3 | 2016-02-05 11:45:00 |  20 | 2016-02-05 11:30:00
(3 rows)

In der Spalte 'freizeit' siehst halt, wie viel Zeit zwischen der Endzeit des vorherigen Termines und dem neuen Termin ist. Ist wohl das, was Du suchst, oder?
 
Hallo,

genau das wäre es. hab es grad mal auf nem 2012er probiert, dort kennt er lag und lead. da muss ich mal schauen wie es weitergehen kann. es sei denn es kommt noch ne lösung die programmieren kann, was aber eher umständlich u aufwändig ist.....
 
Du kannst lag() umgehen in dem du die Tabelle mit ROW_NUMBER() OVER (PARTION BY x ORDER BY y) ausließt (am Besten eine Sicht als Zwischenschritt) und dann mit sich selbst joinst. x sind dabei alle Bedingungen wie Raum die das ganze unterteilen und y ist dann die Startzeit. Dann hast du den Folgeeintrag (oder auch den vorherigen Eintrag) und kannst End und Startzeit vergleichen.
 
Werbung:
Zurück
Oben