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