Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

MSSQL Werte verschiedener Zeilen addieren/vergleichen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von CO@CO, 5 Februar 2016.

  1. CO@CO

    CO@CO Neuer Benutzer

    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:

  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. CO@CO

    CO@CO Neuer Benutzer

    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...
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    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?
     
    Walter gefällt das.
  6. CO@CO

    CO@CO Neuer Benutzer

    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.....
     
  7. ukulele

    ukulele Datenbank-Guru

    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.
     
    Walter gefällt das.
  8. CO@CO

    CO@CO Neuer Benutzer

    Hallo,

    hat funktiert mit Row number u dem self join ...

    Danke
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden