Решение будет зависеть от сервера базы данных, поскольку синтаксис для запросов TOP различается. По сути, вы ищете запрос " top n на группу ", так что вы можете это сделать в Google, если хотите.
Вот решение в SQL Server. Следующее вернет 10 лучших игроков, которые бьют больше всего хоум-ранов в год с 1990 года. Ключ заключается в том, чтобы подсчитать «Ранж Home Run» каждого игрока за каждый год.
select
HRRanks.*
from
(
Select
b.yearID, b.PlayerID, sum(b.Hr) as TotalHR,
rank() over (partition by b.yearID order by sum(b.hr) desc) as HR_Rank
from
Batting b
where
b.yearID > 1990
group by
b.yearID, b.playerID
)
HRRanks
where
HRRanks.HR_Rank <= 10
Вот решение в Oracle (Лучшие продавцы на отдел)
SELECT deptno, avg_sal
FROM(
SELECT deptno, AVG(sal) avg_sal
GROUP BY deptno
ORDER BY AVG(sal) DESC
)
WHERE ROWNUM <= 10;
Или используя аналитические функции:
SELECT deptno, avg_sal
FROM (
SELECT deptno, avg_sal, RANK() OVER (ORDER BY sal DESC) rank
FROM
(
SELECT deptno, AVG(sal) avg_sal
FROM emp
GROUP BY deptno
)
)
WHERE rank <= 10;
Или снова то же самое, но с использованием DENSE_RANK () вместо RANK ()