SQL Problem


Morgon123

Still Fresh
Joined
May 8, 2007
Messages
34
ICQ
86939973
Hi,
ich hab mal ne Frage an die ganzen SQL/Programmiergenies dies hier doch sicher gibt :)
Ich hab ne Tabelle mit folgender Struktur:

[DATUM] [ZAHL] [WEITERE DATEN]

also z.b.

01/01/10 1 XXXXX
01/01/10 2 XXXXX
01/01/10 2 XXXXX
01/02/10 1 XXXXX
01/02/10 2 XXXXX
01/02/10 3 XXXXX
usw.

Jetzt müsste ich aus dieser Tabelle Pro Datum die Zeile(n) mit der höchsten Zahl rausziehen, also hier:

01/01/10 2 XXXXX
01/01/10 2 XXXXX
01/02/10 3 XXXXX

Ist das via SQL irgendwie möglich? Bin da mit meinen Grundkenntnissen leider etwas überfordert...
 
Ja. Es wird eine verschachtelte Abfrage benötigt:
Code:
SELECT * FROM (SELECT * FROM tab1 ORDER BY Zahl DESC) AS temp GROUP BY Datum
 
Die Abfrage funktioniert so nicht. Ein "GROUP BY" benötigt eine Aggregation im SELECT - Abschnitt. Zudem ist die Aufgabenstellung nicht erfüllt :).

Das Problem hier ist, das der Fall nicht ausgeschlossen werden kann, dass die gleiche Zahl pro Datum eventuell mehrfach vorkommen kann. Wenn man diesen Fall nicht beachtet, geht es wie folgt:
Code:
select t2.*
from (select datum, max(zahl) as maxzahl from tab1 group by datum) as t1 inner join tab1 as t2 on (t1.datum = t2.datum) and (t1.maxzahl = t2.zahl)
order by t2.datum
Die innere Abfrage liefert die größte Zahl pro Datum. Das Ergebnis wird mit einem EQUAL - Join mit der Tabelle über das gefunden Datum und die maximale Zahl verknüpft, so dass pro Zeile der Originale Datensatz wieder raus gefischt wird.

So ungefähr sollte es gehen. Das Problem ist, wenn die gleich Zahl beim gleich Datum mehrmals vorkommt, dann wird diese Zeile mehrfach angezeigt. Mit einem DISTINCT vor t2.* könnte man das eliminieren, hängt aber von den weiteren Daten ab, ob z. B. ein eindeutiger Schlüssel oder TEXT - Feld existiert, bei dem der DISTINCT nichts bringt/funktioniert.

Gruß
Thomas
 
Folgendes liefert - zumindest für dein Datenbeispiel - das, was Du möchtest, Morgon123:
Code:
SELECT *
  FROM TabellenName
  WHERE TO_CHAR(datum) || '=' || TO_CHAR(zahl) IN
  (
    SELECT TO_CHAR(datum) || '=' || TO_CHAR(MAX(zahl))
      FROM TabellenName
    GROUP BY datum
  );

Eventuell möchtest Du für das äußere SQL-Stament noch ein
Code:
ORDER BY datum, zahl
anfügen.
 
Back
Top