mikrocontroller.net

Forum: PC-Programmierung SQL Aggregatfunktion Max()


Autor: Ja mann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhhhh, Vorsicht... die Aggregatfunktion rattert da über sämtliche 
Zeilen...

Machs doch so: 1. Sortieren, 2. Limitieren
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.

Autor: Ja mann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FBI (Gast)
Datum:

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

Hab aber keine Ahnung, ob Firebird dabei auch mitspielt.

CU

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

>
SELECT KOMMENTAR FROM TABELLE WHERE DATUM = (SELECT MAX(DATUM) FROM
> 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:
>
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.
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.