Проверяет умение агрегировать данные и выбирать топ-N записей по вычисленному значению, что часто требуется в аналитике и отчётах.
Задача «топ-N по агрегату» возникает постоянно: топ-10 клиентов по выручке, топ-5 товаров по продажам, топ-3 категории по числу заказов. Ключевая идея в том, что сначала нужно свернуть множество строк в группы и посчитать метрику, а уже потом отсортировать и обрезать результат.
Логический порядок выполнения запроса важен: агрегация происходит до сортировки, а сортировка — до ограничения количества строк. Поэтому нельзя просто написать WHERE SUM(...) > ... — для фильтрации по агрегату нужен HAVING.
FROM и JOIN — собираем исходные данные.WHERE — фильтруем строки до агрегации.GROUP BY — формируем группы.HAVING — фильтруем уже готовые группы.ORDER BY — сортируем по агрегату.LIMIT / TOP — берём N строк.SELECT
c.id,
c.name,
SUM(o.amount) AS total
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid' -- фильтр до агрегации
GROUP BY c.id, c.name
ORDER BY total DESC
LIMIT 3; -- в SQL Server: SELECT TOP 3 ...
GROUP BY перечисляйте все неагрегированные колонки из SELECT, иначе получите ошибку или неопределённый результат.ORDER BY total DESC, c.id.ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY sales DESC) и фильтр по номеру.SELECT * FROM (
SELECT
category_id, product_id, sales,
ROW_NUMBER() OVER (
PARTITION BY category_id ORDER BY sales DESC
) AS rn
FROM product_sales
) t
WHERE rn <= 3;
Итог: для простого топ-N по агрегату достаточно GROUP BY + ORDER BY + LIMIT, а когда нужен топ внутри каждой группы — применяйте оконные функции с PARTITION BY.
Уровень
Рейтинг:
5
Сложность:
4
Навыки
Postgres
SQL
Ключевые слова
Подпишись на Node.js Developer в телеграм