Min/Max verhalten

Sharete

Benutzer
Beiträge
7
Okay, ich muss doch nochmal einen Thread erstellen, da es sonst zu unübersichtlich wird. Und zwar folgendes Szenario:

Ich möchte aus einer Tabelle die Person ausgeben, die am jüngsten ist. Erst wollte ich es so probieren:

Code:
select
max(geburtsdatum), nachname, vorname
from kunden
group by nachname, vorname

So gibt er mir allerdings ALLE Namen aus und nicht die jüngste Person... Lasse ich Nachname und Vorname als Attribut weg, funktioniert es. Wieso ist das so? Wie kann ich die jüngste Person ausgeben MIT Namen?

LG
 
Werbung:
Das GROUP BY macht das, was der Name schon sagt: es bildet Gruppen. Wenn Vor- und Nachname angegeben sind, dann bilded es für jede Kombination von Vor- und Nachname (Gruppe) die Aggregation (max() hier z.B.). Ist Vor- und Nachname nicht im Resultat, muß es danach auch nicht gruppiert werden, dann besteht nur eine Gruppe: ALLE Datensätze.

Dein Problem wäre z.B. lösbar, indem Du nach dem GROUP BY nor ein ORDER BY ... DESC und ein LIMIT 1 einbaust:

Code:
test=# create table sharete (vname text, nname text, gebdatum date);
CREATE TABLE
test=*# insert into sharete values ('max','mustermann','2001-01-01');
INSERT 0 1
test=*# insert into sharete values ('susi','sorglos','2002-01-01');
INSERT 0 1
test=*# select max(gebdatum) from sharete ;
  max   
------------
 2002-01-01
(1 row)
test=*# select max(gebdatum), vname, nname from sharete group by vname, nname;
  max  | vname |  nname   
------------+-------+------------
 2001-01-01 | max  | mustermann
 2002-01-01 | susi  | sorglos
(2 rows)
test=*# select max(gebdatum), vname, nname from sharete group by vname, nname order by max(gebdatum);
  max  | vname |  nname   
------------+-------+------------
 2001-01-01 | max  | mustermann
 2002-01-01 | susi  | sorglos
(2 rows)

test=*# select max(gebdatum), vname, nname from sharete group by vname, nname order by max(gebdatum) desc;
  max  | vname |  nname   
------------+-------+------------
 2002-01-01 | susi  | sorglos
 2001-01-01 | max  | mustermann
(2 rows)

test=*# select max(gebdatum), vname, nname from sharete group by vname, nname order by max(gebdatum) desc limit 1;
  max  | vname |  nname  
------------+-------+---------
 2002-01-01 | susi  | sorglos
(1 row)

test=*#
 
Werbung:
Oder so:
Code:
select name,vorname from kunden where
geburtsdatum=(select max(geburtsdatum) from kunden);

Ein Index auf das Geburtsdatum beschleunigt das natürlich nochmal.
 
Zurück
Oben