SQL Aggregatfunktion Max()

Gast #896093
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
Gast #896096
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.
Gast #896106
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
Gast #896266
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
Gast #896283
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.
#896301
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren