Forum: PC-Programmierung SQL Aggregatfunktion Max()


von Ja mann (Gast)


Lesenswert?

Tach,

ich habe eine Tabelle in der Form

|DATUM|KOMMENTAR|
|1.1.08|Neujahr eben|
|31.5.07|Geburtstag von jemandem|
|8.3.08|Namestag von einigen|

Mich interessiert nun der Kommentar des jüngsten Datums. Mit
SELECT MAX(DATUM) FROM TABELLE
das jüngste Datum herauszubekommen ist ja kein Problem, aber wie hole 
ich mir den Kommentar dazu ?

Ja mann

von Sven P. (Gast)


Lesenswert?

Uhhhh, Vorsicht... die Aggregatfunktion rattert da über sämtliche 
Zeilen...

Machs doch so: 1. Sortieren, 2. Limitieren
1
SELECT * FROM deine_tabelle ORDER BY datum DESC LIMIT 1

Hmm...*grübel*, ich glaub, du weißt, was ich meine. Gugg aber mit der 
Abfrage  nochmal nach, hab schon ewig nix mehr mit SQL gemacht.

von Ja mann (Gast)


Lesenswert?

Ahhh, super!

Hatte zwar vergessen zu sagen dass ich Firebird benutze und es da kein 
Limit gibt, aber dafür gibt es ein "FIRST", dass mit nur den ersten 
Datensatz anzeigt. Mit einer umgekehrten Sortierung ist das dann auch 
erledigt.

Besten Dank!

Ja mann

von FBI (Gast)


Lesenswert?

Normalerweise sollte das auch mit MAX gehen.
Entweder mit einer Subquery:
1
SELECT KOMMENTAR FROM TABELLE WHERE DATUM = (SELECT MAX(DATUM) FROM TABELLE)
oder mittels GROUP BY:
1
SELECT KOMMENTAR, MAX(DATUM) FROM TABELLE GROUP BY KOMMENTAR

Hab aber keine Ahnung, ob Firebird dabei auch mitspielt.

CU

von Sven P. (Gast)


Lesenswert?

@FBI: Ja, geht schon. Ist aber reichlich umständlich: Entweder zwei 
Abfragen (mit Unterabfrage!) oder ein Group-By über ein Textfeld -- 
beides ist nicht gerade effizient. Könnte letztlich auch seltsam 
ausarten, wenn mehrere Datensätze das gleiche Datum haben.

von Frank L. (franklink)


Lesenswert?

Hallo,

>
1
SELECT KOMMENTAR FROM TABELLE WHERE DATUM = (SELECT MAX(DATUM) FROM
2
> TABELLE)

Dies ist bei Firebird die schnellste Möglichkeit an das Datum und den 
Kommentar zukommen, wenn auf das Datum ein Index liegt. Dann spielen die 
dahinter liegenden Datenmengen keine Rolle mehr.

> oder mittels GROUP BY:
>
1
SELECT KOMMENTAR, MAX(DATUM) FROM TABELLE GROUP BY KOMMENTAR
>

Diese Variante kann nur verwendet werden, wenn KOMMENTAR keine BLOB ist, 
wird aber wahnsinnig langsam, weil auf KOMMENTAR wahrscheinlich kein 
Index liegen würde. Hinzu kommt, dass die Wahrscheinlichkeit das der 
Optimizer hier zu schlagen eher gering ist.

Aber auch bei der ersten Variante gibt es das Problem, wenn Du nur den 
letzten Kommentar zu einem Datum haben willst, dass Du bei zwei 
Einträgen an einem Tag nicht unbedingt den letzten bekommen wirst.

Es sein denn, Dein Datum ist ein Timestamp, oder Deine Tabelle wird mit 
einer zusätzlichen ID versehen die als primary key fungiert.

Ich würde die Variante mit der ID verwenden, da ich dann sicher bin, 
dass der Datensatz mit der größten ID auch den letzten Kommentar 
enthält.

Das Füllen der ID kann über einen BEFOREINSERT-Trigger auf der Datenbank 
direkt erfolgen. Ich nutze dazu die Firebird Funktion GEN_ID in 
Verbindung mit einem Generator.
1
SELECT KOMMENTAR FROM TABELLE WHERE ID = ( SELECT MAX(ID) FROM TABELLE )

Wichtig bei dieser Variante ist, das das Feld ID unbedingt PRIMARYKEY 
sein muss und vom Typ INTEGER, dann erreichst Du auch bei größten 
Datenmengen beste Performance.

Gruß
Frank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.