Найти максимальное значение в агрегатной функции - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть следующий запрос

USE Movies;

SELECT
    c.CountryName
    ,d.DirectorName
    ,f.FilmRunTimeMinutes AS [TotalRunTime]
FROM
    tblFilm as f
    JOIN tblCountry as c on c.CountryID = f.FilmCountryID
    JOIN tblDirector as d on d.DirectorID = f.FilmDirectorID
ORDER BY
    DirectorName

, который дает мне следующий результат:

enter image description here

пока все хорошо.

Затем я сгруппировал свой результат, чтобы суммировать TotalRunTime для каждого директора и страны:

SELECT
    c.CountryName
    ,d.DirectorName
    ,SUM(CONVERT(DECIMAL, f.FilmRunTimeMinutes)) AS [TotalRunTime]
    ,COUNT(*)
FROM
    tblFilm as f
    JOIN tblCountry as c on c.CountryID = f.FilmCountryID
    JOIN tblDirector as d on d.DirectorID = f.FilmDirectorID
GROUP BY
    CountryName
    ,DirectorName

, что дает мне следующий результат:

enter image description here

Теперь я хочу, чтобы актер с наибольшим количеством (*) (столбец «без имени столбца»), и я попробовал это:

SELECT
    c.CountryName
    ,d.DirectorName
    ,SUM(CONVERT(DECIMAL, f.FilmRunTimeMinutes)) AS [TotalRunTime]
    ,COUNT(*)
FROM
    tblFilm as f
    JOIN tblCountry as c on c.CountryID = f.FilmCountryID
    JOIN tblDirector as d on d.DirectorID = f.FilmDirectorID
GROUP BY
    CountryName
    ,DirectorName
HAVING
    COUNT(*) = MAX(Count(*))

Но это не работает:(. Не могли бы вы объяснить, почему он не работает в деталях, и как я могу получить строку с максимальным (count (*))? В этом примере это должно дать мне строку Japan | Akira usw.

1 Ответ

0 голосов
/ 15 ноября 2018

Просто используйте TOP (1) предложение:

SELECT TOP (1) c.CountryName, d.DirectorName,
       SUM(CONVERT(DECIMAL, f.FilmRunTimeMinutes)) AS [TotalRunTime]
       COUNT(*) AS cnt
FROM tblFilm as f JOIN 
     tblCountry as c 
     on c.CountryID = f.FilmCountryID JOIN 
     tblDirector as d 
     on d.DirectorID = f.FilmDirectorID
GROUP BY CountryName, DirectorName
ORDER BY cnt DESC;

Однако, это может произойти сбой, если cnt имеет связи, если так, тогда используйте RANK() вместо:

SELECT t.*
FROM (SELECT c.CountryName, d.DirectorName,
             SUM(CONVERT(DECIMAL, f.FilmRunTimeMinutes)) AS [TotalRunTime]
             COUNT(*) AS cnt,
             RANK() OVER (ORDER BY COUNT(*) DESC) AS Seq
      FROM tblFilm as f JOIN 
           tblCountry as c 
           ON c.CountryID = f.FilmCountryID JOIN 
           tblDirector as d 
           ON d.DirectorID = f.FilmDirectorID
      GROUP BY CountryName, DirectorName
    ) t
WHERE seq = 1;
...