Этот вопрос старый, но на него ссылаются в новом вопросе на dba.SE . Я чувствую, что лучшие решения еще не были предоставлены, поэтому я добавляю еще одно.
Во-первых, при условии ссылочной целостности (обычно с ограничениями внешнего ключа) вам не нужно присоединяться к таблице movie
вообще . Это мертвый груз в вашем запросе. Все ответы до сих пор не указывают на это.
Могу ли я сделать max(count(*))
в SQL?
Чтобы ответить на вопрос в заголовке: Да , в Postgres 8.4 (выпущен 2009-07-01, до того, как был задан этот вопрос) или позже, вы можете добиться этого, вложив агрегатную функцию в оконная функция :
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;
Рассмотрим последовательность событий в запросе SELECT
:
(Возможный) недостаток: оконные функции не агрегируют строки. Вы получите всех строк, оставшихся после этапа агрегирования. Полезно в некоторых запросах, но не идеально для этого.
Чтобы получить одну строку с наибольшим количеством, вы можете использовать ORDER BY ct LIMIT 1
как @ wolph hinted :
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;
Использование только основных функций SQL, доступных в любой наполовину приличной СУБД - реализация LIMIT
варьируется:
Или вы можете получить по одной строке на группу с наибольшим количеством DISTINCT ON
(только Postgres):
Ответ
Но вы просили:
... строк, для которых количество (*) равно макс.
Возможно, больше, чем один. Наиболее элегантное решение - использование оконной функции rank()
в подзапросе. Райан предоставил запрос , но это может быть проще (подробности в моем ответе выше):
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;
В настоящее время все основные СУБД поддерживают оконные функции. За исключением MySQL и вилок ( MariaDB, кажется, реализовал их наконец в версии 10.2 ).