# Vergleichen von zwei aufeinanderfolgenden Zeilen



## julia23 (3. März 2015)

My SQL Server

Ich möchte Werte in Aufeinanderfolgenden Werten miteinander vergleichen. 

Die Tabelle hat einen StartDate und EndDate. 

Ich möchte nach EndDate sortieren ( also dementsprechend order by EndDate)
und dann Herausfinden ob EndDate> als StartDate der nächsten Zeile in der Tabelle ist. 

Und dann diese werte zählen. Also zählen solange EndDate > startDate ist und dann wieder
bis ich am Ende meiner Liste bin. 

Und daraus will ich dann das Maximum herausfiltern. 

Etwas kompliziert, aber es würde mir zunächst schon weiterhelfen, wie ich eine 
while schleife mache, inder ich Herausfinden ob EndDate> als StartDate der nächsten Zeile in der Tabelle ist. 

Kann mir bitte jemand weiterhelfen?


----------



## Yaslaw (4. März 2015)

Ein sortiertes Subquery erstellen.
Dann Ein Select mit Variablen initialisieren

Darum wieder ein Select legen und vergleichen.
Auf was gruppiert du das Maximum haben willst, habe ich nicht herausgefunden


```
SELECT
    -- Die LAufnummer defineiren.
    @nr := CASE
        WHEN @last_enddate > data.startdate
        THEN @nr + 1
        ELSE 0
    END AS nr,
    -- Das Datum merken. ACHTUNG! Das muss nach dem setzen der @nr sein!
    @last_enddate := data.lastdate
    -- //TODO: Weitere Felder ausgeben
FROM
    -- Die Variablen initialisieren
    (SELECT @nr:= 0, @last_enddate:=NULL) AS vars,
    -- Die Daten sortieren
    (
        SELECT t.*
        FROM my_table AS t
        ORDER BY enddate
    ) AS data
```


----------



## julia23 (4. März 2015)

Hallo Yaslaw, vielen Dank für deine ausführliche Antwort. Das hilft mir definitiv schon mal weiter.
Aber ich will die innerhalb der Schleife zählen, (bis das StartDate größer ist als das EndDate).  StartDate u EndDate werde in Sek angegeben.
Dann sollte ich eine Liste von "Counts" erhalten. Daraus will ich dann das Maximum herausfinden.
Hier mal ein Beispiel



Dann würde die ersten 4 Zeilen gezählt werden.
Denn ab da wäre 6<=5 nicht mehr gegeben.
StartDate<= EndDate.

Dann erhalte ich eine Liste von Counts,
hier in dem Beispiel relativ klein:
4
3

Das Maximum aus dieser Liste wäre dann 4.

So will ich herausfinden, in welcher Sekunde die Maximale anzahl
an Anrufen war.


----------



## Yaslaw (4. März 2015)

Die Logik ein wenig umstellen und fertig

Viel Spass. Das "all in one wonder".
Unter first_id hast du dann die Datensatz-ID des ersten Eintrages der grössten Gruppe


```
SELECT
    groups.grp,
    MIN(id) AS first_id,
    COUNT(groups.id) AS cnt
FROM
    (
        SELECT
            data.id,
            @grp := CASE
                WHEN @last_enddate >= DATA.startdate
                THEN @grp
                ELSE @grp+1
            END AS grp,
            @last_enddate := DATA.enddate
        FROM
            (SELECT @grp:= 0, @last_enddate:=NULL) AS vars,
            -- Die Daten sortieren
            (
                SELECT t.*
                FROM tbl AS t
                ORDER BY enddate
            ) AS data
    ) AS groups
GROUP BY
    groups.grp
ORDER BY
    COUNT(groups.id) DESC
LIMIT 1
```


----------



## julia23 (4. März 2015)

Yaslaw hat gesagt.:


> Ein sortiertes Subquery erstellen.
> Dann Ein Select mit Variablen initialisieren
> 
> Darum wieder ein Select legen und vergleichen.
> ...




Leider wirft mir das Programm hier mehrere Fehler. 

Ich hab noch 

```
Declare @grp INT
Declare @last_enddate INT
```

eingefügt. 

Trotzdem: Die ersten drei:
Beim ersten : 
"Falsche Syntax in der Nähe von ":""

"Falsche Syntax in der Nähe von THEN"

"Falsche Syntax in der Nähe von AS. erwartet wird CONVERSATION "


Oder habe ich was


----------



## Yaslaw (4. März 2015)

Solltes du die DECLARE-Zeilen nicht mit einem; abschliessen?

Ich habe das Query mit Xampp (MySQL) und dem Tool Heidisql getestet.

Bist du sicher, dass du einen MySQL-Serverhast und nicht ein MS SQL Server?


----------



## julia23 (4. März 2015)

oh ja ich habe MS SQL Server, sorry ich hab tatsächlich MySQL geschrieben...

Aber die declare muss ich nicht mit; abschließen.


----------



## Yaslaw (5. März 2015)

MS SQL. Vergiss mein SQL. Das wird so nicht funktionieren. Das war MySQL-spezifsch.

Keine Ahnung wie das in MS SQL zu lösenist


----------

