Diese Frage ist alt, wurde aber in einer neuen Frage auf dba.SE referenziert . Ich bin der Meinung, dass die besten Lösungen noch nicht bereitgestellt wurden, daher füge ich eine weitere hinzu.
Zunächst einmal, referentielle Integrität angenommen ( in der Regel mit Fremdschlüssel - Constraints erzwungen) Sie nicht auf den Tisch kommen müssen überhaupt . Das ist tote Fracht in Ihrer Anfrage. Alle bisherigen Antworten weisen nicht darauf hin.movie
Kann ich eine max(count(*))in SQL machen?
So beantworten Sie die Frage im Titel: Ja , in Postgres 8.4 (veröffentlicht am 01.07.2009, bevor diese Frage gestellt wurde) oder später können Sie dies erreichen, indem Sie eine Aggregatfunktion in eine Fensterfunktion verschachteln :
SELECT c.yr, count(*) AS ct, max(count(*)) OVER () AS max_ct
FROM actor a
JOIN casting c ON c.actorid = a.id
WHERE a.name = 'John Travolta'
GROUP BY c.yr;
Betrachten Sie die Reihenfolge der Ereignisse in einer SELECTAbfrage:
Die (möglichen) Nachteile: Fensterfunktionen aggregieren keine Zeilen. Sie erhalten alle Zeilen nach dem Aggregatschritt übrig. Nützlich bei einigen Abfragen, aber nicht ideal für diese.
Um eine Zeile mit der höchsten Zählung, können Sie ORDER BY ct LIMIT 1wie @wolph angedeutet :
SELECT c.yr, count(*) AS ct
FROM actor a
JOIN casting c ON c.actorid = a.id
WHERE a.name = 'John Travolta'
GROUP BY c.yr
ORDER BY ct DESC
LIMIT 1;
Verwenden Sie nur grundlegende SQL-Funktionen, die in einem halbwegs anständigen RDBMS verfügbar sind. Die LIMITImplementierung variiert:
Oder Sie erhalten eine Zeile pro Gruppe mit der höchsten Anzahl mit DISTINCT ON(nur Postgres):
Antworten
Aber Sie haben gefragt:
... Zeilen, für die count (*) max.
Möglicherweise mehr als eine. Die eleganteste Lösung ist die Fensterfunktionrank() in einer Unterabfrage. Ryan hat eine Anfrage gestellt , die aber einfacher sein kann (Details in meiner Antwort oben):
SELECT yr, ct
FROM (
SELECT c.yr, count(*) AS ct, rank() OVER (ORDER BY count(*) DESC) AS rnk
FROM actor a
JOIN casting c ON c.actorid = a.id
WHERE a.name = 'John Travolta'
GROUP BY c.yr
) sub
WHERE rnk = 1;
Alle wichtigen RDBMS-Unterstützungsfensterfunktionen werden heutzutage verwendet. Außer MySQL und Forks ( MariaDB scheint sie endlich in Version 10.2 implementiert zu haben ).