Problem mit SQL Statement



  • Hallo!

    Ich habe eine Tabelle:
    ID (int)
    Zahl (int)
    Datum (timestamp)

    Nun brauche ich aus dieser Tabelle jeweils die Zeile mit dem höchsten Datum pro Zahl.
    Aber irgendwie komme ich nicht drauf. 😞

    Ich habe bisher Folgendes:

    SELECT MAX(Datum) AS Maxdatum FROM Tabelle GROUP BY Zahl
    

    Das sucht mir das jeweils höchste Datum pro Zahl.
    Ich brauche aber die IDs dieser Zeilen.
    Um sie mit anzeigen zu lassen, müsste ich sie in das GROUP BY mit aufnehmen, aber das verfälscht mir ja die Abfrage.

    Weiß jemand Rat? 😕



  • estartu schrieb:

    Ich habe bisher Folgendes:

    SELECT MAX(Datum) AS Maxdatum FROM Tabelle GROUP BY Zahl
    

    Das sucht mir das jeweils höchste Datum pro Zahl.
    Ich brauche aber die IDs dieser Zeilen.
    Um sie mit anzeigen zu lassen, müsste ich sie in das GROUP BY mit aufnehmen, aber das verfälscht mir ja die Abfrage.

    Echt? Geht das so überhaupt? Ich dachte man kann nur ein GROUP BY auf Spalten machen, die man auch auswählt.
    Also

    SELECT Zahl, ID, MAX(Datum) AS Maxdatum FROM Tabelle GROUP BY Zahl
    




  • Ui, da war ich ja blind... 🙄

    hm.... schrieb:

    Echt? Geht das so überhaupt? Ich dachte man kann nur ein GROUP BY auf Spalten machen, die man auch auswählt.

    SQL Server sagt, wenn ich einfach so ID noch haben will:

    ---------------------------
    SQL Server Enterprise Manager
    ---------------------------
    [Microsoft][ODBC SQL Server Driver][SQL Server]Die Tabelle.ID-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
    ---------------------------
    OK Hilfe
    ---------------------------

    Das klingt für mich genau andersrum. 😉

    Aber ich glaube, jetzt sollte ich es hinkriegen, danke. 👍



  • select id, zahl
      from Tabelle t1
     where Datum = (select max(Datum)
                      from Tabelle t2
                     where t1.zahl = t2.zahl)
    

    Tntnet



  • Beim SQL-Server sollte es so gehen:

    select t1.zahl, 
           t1.datum,
           t1.id
    from table1 t1
    where t1.id in (
    	select top 1 t2.id
    	from table1 t2
    	where t2.zahl = t1.zahl
    	order by t2.datum desc
    )
    

    :xmas1:

    EDIT: tntnets-Version geht aber auch



  • Oh super, das wollte ich grade fragen. 😃
    Leider klappt es nicht so ganz...

    Ich habe jetzt:

    SELECT Zahl
    FROM         Tabelle t1
    WHERE     (Datum =
                              (SELECT     MAX(Datum)
                                FROM          Tabelle t2
                                WHERE      t1.id = t2.id
                                GROUP BY Zahl))
    ORDER BY Zahl
    

    Weil, ich brauche Zahl als einziges zurückgegebene Spalte, damit ich das Ergebnis ist einem Where verwerten kann: ID in (select...). 😉

    PS: Bei der aktuellen Lösung bekomme ich wieder alle Zeilen. 😕



  • Ah, mit dem top scheint es zu klappen. 👍

    SELECT     Zahl
    FROM         Tabelle t1
    WHERE     (ID IN
                              (SELECT     TOP 1 t2.id
                                FROM          Tabelle t2
                                WHERE      t2.zahl = t1.zahl
                                ORDER BY t2.datum DESC))
    ORDER BY zahl
    

    Mit where t1.id = t2.id bekomme ich wieder alle Zeilen.

    Ich versuche es mal ins Programm zu integrieren. 🙂


Anmelden zum Antworten