Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL Profi gesucht! ;-)
rookie2006
02-08-2007, 12:14
Hallo,
folgende Aufgabenstellung:
Eine Datenbank Ranking, in welche jeweils das aktuelle Ranking im Verein eingetragen wird. Bsp:
Athlet | Rang | Punkte | Datum
1 1 100 11.04.2007
2 2 80 11.04.2007
1 2 120 15.04.2007
2 1 125 15.04.2007
Nun benötige ich eine SQL Abfrage, die mir die aktuellsten Einträge jedes Athleten nach Rang sortiert ausgiebt. Das Ergebnis sollte folgendermassen aussehen:
Athlet | Rang | Punkte | Datum
2 1 125 15.04.2007
1 2 120 15.04.2007
Bis jetzt funzte es mit folgendem SQL:
SELECT t1.athlet, t1.rang, t1.punkte, t1.Datum
FROM test t1 LEFT OUTER JOIN
test t2 ON t1.Datum < t2.Datum
GROUP BY t1.athlet, t1.rang, t1.punkte, t1.Datum
HAVING (t2.Datum IS NULL)
ORDER BY t1.rang, t2.Datum
Das liefert aber aktuell keine Datensätze retour :-(
Wo liegt der Hund begraben???
DANKE FÜR EURE HILFE!
Batigoal
02-08-2007, 12:47
Hallo,
SELECT t1.athlet, t1.rang, t1.punkte, t1.Datum
FROM test t1 LEFT OUTER JOIN
test t2 ON t1.Datum < t2.Datum
GROUP BY t1.athlet, t1.rang, t1.punkte, t1.Datum
HAVING (t2.Datum IS NULL)
ORDER BY t1.rang, t2.Datum
Also meiner Meinung nach kann die Abfrage nicht gscheit funktionieren.
Aber ich kann noch nicht helfen, weil aus dieser Angabe geht eines nicht hervor:
Warum wird bei der Abfrage t2.Datum auf NULL gerpüft?
Heißt das, daß beim aktuellsten Eintrag das Datum nicht gesetzt wurde? Dann stimmt aber dein Beispiel nicht....
rookie2006
02-08-2007, 13:09
Nein, bei allen Einträgen ist das Datum gesetzt.
ich steh auf der leitung :confused:
einen alternativen (und funktionierenden *g*) vorschlag?
Hallo!
SQL ist bei mir schon einige Zeit her aber wie wäre es mit folgendem Denkansatz
-> Suche das maximale Datum jedes einzelnen Fahrers (Aggregat MAX und Group BY) (Ergebnis dieser Abfrage ist dann eine Tabelle mit Fahrer und Datum) -> und Frage dann mit einer "äußeren" Select Abfrage, die Daten der Tabelle ab (Stichwort IN)
mehr fällt mir dazu auch nicht ein
SG NoFool
SELECT test_1.Athlet, test_1.Rang, test_1.Punkte, test_1.Datum
FROM (SELECT Athlet, MAX(Datum) AS Expr1
FROM test
GROUP BY Athlet) AS derivedtbl_1 INNER JOIN
test AS test_1 ON derivedtbl_1.Athlet = test_1.Athlet AND derivedtbl_1.Expr1 = test_1.Datum
ORDER BY test_1.Rang
... Vielleicht irgendwie so
SELECT t3.athlet, t3.rang, t3.punkte, t3.datum
FROM test t3 LEFT OUTER JOIN
(SELECT t1.athlet, MAX(t1.datum) AS maxdatum
FROM test t1
GROUP BY t1.athlet) AS t2
ON t3.athlet = t2.athlet AND t3.datum = t2.maxdatum
ORDER BY t3.rang
der Syntax kann bei dir ev. etwas anders sein (MySQL, MSSQL, Firebird usw) aber so könnte es ev. funktioieren
rookie2006
02-08-2007, 13:48
SELECT test_1.Athlet, test_1.Rang, test_1.Punkte, test_1.Datum
FROM (SELECT Athlet, MAX(Datum) AS Expr1
FROM test
GROUP BY Athlet) AS derivedtbl_1 INNER JOIN
test AS test_1 ON derivedtbl_1.Athlet = test_1.Athlet AND derivedtbl_1.Expr1 = test_1.Datum
ORDER BY test_1.Rang
herzlichen Dank! Das wars!
Batigoal
02-08-2007, 13:49
Stimme meinen Vorpostern im Prinzip zu.
Allerdings kommts auf die Datenbank an, ob das funktioniert
Access z.B. nicht (OK...es ust Access, aber wer weiß was verwendet wird....bzw. welche Verison von z.B. MySql)
Mein Tip: Versieh die Tabelle mit einem Primary Key, dann läßt sich das ganz einfach mit einer IN-Klausel lösen
Batigoal
02-08-2007, 13:50
OK....dann paßt wohl die DB ;)