MAX Funktion

Hallo Community - bin neu hier und auch noch ein SQL Newbie :slight_smile:

Ich habe folgendes Problem. Ich will über eine Anfrage eine weitere Anfrage anwenden und dann daraus den “Professor” mit den meisten Prüfungen ausgeben.

Die folgende Anfrage:

select p.Name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name
order by Anzahl desc

gibt folgendes aus:

Name Anzahl
Kant 3
Sokrates 2
Russell 2

jetzt habe ich mir überlegt, dass ich über die erste select Anfrage eine weitere “stülpe” in der Art, dass

select tmp.Name, tmp.Anzahl
from (select p.Name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name
order by Anzahl desc)tmp
where tmp.anzahl=MAX(tmp.anzahl)
group by tmp.name

Leider funktioniert das nicht, vielleicht kann mir jmd helfen! Verstehe das mit der MAX Funktion noch nicht so richtig bzw. weiß gerade nicht wo ich die Unteranfrage platzieren muss.

Ich sag schon mal vielen Dank
Daniel

… order by count(pr.vorlnr) desc limit 1;

An vermutlich würde auch by anzahl gehen dreas

[/quote]

Hi akretschmer

danke für die schnelle kompetente hilfe.

Nun habe ich das so geschrieben.

select p.Name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name
order by count(pr.vorlnr) desc limit 1

und das klappt auch wunderbar.

Hätte man das auch über die MAX Aggreagatfunktion irgendwo lösen können?

Nochmals vielen Dank!
Daniel

Irgendwie - ja. Zum Bleistift in der Form ‘select max(anzahl) from ( select count(…) as anzahl) foo’ oder so…

Andreas

Habs noch nciht ganz verstanden :slight_smile:
Bei folgender Anfrage kommt

select max(tmp.Anzahl) ,
from (select p.name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name) tmp

die maximale Anzahl von Prüfungen raus.

Jedoch wenn ich nun versuche den name noch dazu zu bekommen, verändert sich das Anfrage Ergebnis zum “Negativen” (aus meiner Sicht)

select max(tmp.Anzahl) , > tmp.name
from (select p.name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name)tmp
group by tmp.name

kommt wieder zu jeder Anzahl der Prüfungen der Püfer (Name) und nicht nur der Prüfer zu den Pürufungen mit dem Maximalen Wert!

Jetzt könnte ich ja wieder sagen order by Anzahl desc limit 1 und dann ist es wieder so wie ich es gewollte habe, aber dann könnte ich mir ja uach die geschachtelte Anfrage sparen. Ich blick gerade nicht mehr durch. Vielleicht kannst du noch ein Tipp raushauen :slight_smile:

Grüße
Daniel

Macht nix - war Bullshit, sorry.

Andreas

Also, sowas wie diese Lösung:

test=*# select * from max;
  name
--------
 foo
 bar
 bar
 foobar
 foo
 foo
(6 rows)

test=*# select name, count(1) as anzahl from max group by name order by 2 desc limit 1;
 name | anzahl
------+--------
 foo  |      3
(1 row)

test=*# select name, anzahl from (select name, count(1) as anzahl from max group by name) foo where anzahl = (select max(anzahl) from (select name, count(1) as anzahl from max group by name) bar);
 name | anzahl
------+--------
 foo  |      3
(1 row)

geht dann zwar ohne das LIMIT, aber schön ist wohl was anderes.

Andreas