SQL Group by max - ganze Zeile anzeigen

Railway

Grünschnabel
Hallo zusammen,

ich bräuchte bitte eure Unterstützung. Folgende Tabelle ist gegeben.

Für Feld ID erfolgen im Laufe der Zeit diverse Update-Sätze. Wie zeige ich die komplette Zeile an (immer den letzten Update-Satz, also den mit der höchsten "laufendeNR"), wenn ich mit "where ID in ('1', '5', '9')" mehrere ID's (nicht alle) abfangen möchte?

Beispiel Tabelle
ID | laufendeNR | VONORT | NACHORT
1 | 2 | Hamburg | München
1 | 6 | Hamburg | Duisburg
1 | 14 | Hamburg | Nürnberg
2 | 4 | Dortmund | Frankfurt
2 | 8 | Dortmund | München
5 | 8 | Dortmund | Stuttgart
5 | 14 | Hamburg | München
5 | 15 | Hamburg | Regensburg
9 | 2 | Bonn | Essen
9 | 12 | Bonn | Füssen

Ergebnis sollte sein:
1 | 14 | Hamburg | Nürnberg
5 | 15 | Hamburg | Regensburg
9 | 12 | Bonn | Füssen

Danke!
 
Hallo,

als erstes ergibt sich mir die Frage, warum du in der Tabelle keinen primary key verwendest. Ist die Tabelle so vorgegeben oder kannst du da am Design noch was machen? Das würde die Abfragen ernorm vereinfachen.
 
ungetestet:
SQL:
select
    *
from
    your_table t
where t.ID + t.laufendeNR in
    (
         select
            CONCAT(ID,MAX(laufendeNR ))
        from
            your_table t
        where
            t.ID in ('1', '5', '9')
        group by ID
     )
 
Warum Einfach, wenn es auch kompliziert geht.
SQL:
SELECT
    t1.*
FROM
    your_table t1
JOIN
    (
         SELECT
            ID
            ,MAX(laufendeNR ) as laufendeNR
        FROM
            your_table t
        WHERE
            t.ID IN ('1', '5', '9')
        GROUP BY ID
     ) t2
    ON t2.ID = t1.ID
    AND t2.laufendeNR = t1.laufendeNR
 
Moin Railway,

die Abfrage würde auch mit primary key nicht anders aussehen... fachlich und vielleicht auch physisch ist der "identifizierende Schlüssel", der Eindeutigkeit der Daten sicherstellt, doch die Kombination aus "ID" und "LaufendeNr".

Allerdings solltest du Kalitos Statement noch abändern bzgl der IN-Klausel.
Denn die LaufendeNR muss schon numerisch sein....
SQL:
SELECT
    t1.*
FROM
    your_table t1
JOIN
    (
         SELECT
            ID
            ,MAX(laufendeNR ) AS MaxLfdNR
        FROM
            your_table t
        WHERE
            t.ID IN ( 1,  5,  9)
        GROUP BY ID
     ) t2
    ON t2.ID = t1.ID
    AND t2.maxLfdNR = t1.laufendeNR

.... wenn in "LaufendeNR" Strings stünden, wie Kalito unterstellt hat, dann würde bei der MAX()-Ermittlung Unerwünschtes herauskommen, wenn LaufendeNR mal einen Wert > 9 hat.
Beispiel "1" ist < "10" -ok.
Aber: "10" ist < "2" -> nicht ok.

Grüße
Biber
 

Neue Beiträge

Zurück