Це питання старий, але посилання в новому питанні про dba.SE . Я відчуваю, що поки що найкращих рішень не надано, тому я додаю ще одне.
По- перше, за умови посилальної цілісності ( як правило , з справлянням зовнішнього ключа) вам не потрібно , щоб приєднатися до столу на всіх . Це мертвий вантаж у вашому запиті. Усі відповіді поки що не вказують на це.movie
Чи можу я зробити max(count(*))в SQL?
Щоб відповісти на запитання в заголовку: Так , у Postgres 8.4 (випущено 01.07.2009 р. До того, як було задано це питання) або пізнішої версії, ви можете досягти цього, вклавши сукупну функцію у віконну функцію :
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 натякнув :
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 ).