22. Найти топ-3 посетителей по количеству визитов
Условие задачи:
Дана таблица visits:
visits
visit_id
visitor_name
timestamp
Необходимо вывести трёх посетителей с наибольшим количеством визитов.
Спойлеры к решению
Подсказки
💡 Сгруппируй записи по
💡 Количество визитов можно посчитать через
💡 Отсортируй результат по убыванию количества визитов.
💡 Ограничь результат тремя строками через
visitor_name.💡 Количество визитов можно посчитать через
COUNT(*).💡 Отсортируй результат по убыванию количества визитов.
💡 Ограничь результат тремя строками через
LIMIT 3.Решение
Самый простой вариант:
SELECT
visitor_name,
COUNT(*) AS visit_count
FROM visits
GROUP BY visitor_name
ORDER BY visit_count DESC
LIMIT 3;
GROUP BY visitor_name объединяет все визиты одного посетителя.
COUNT(*) AS visit_count
считает количество визитов, а:
ORDER BY visit_count DESC
LIMIT 3
оставляет трёх посетителей с максимальным количеством посещений.
Если нужно корректно учитывать одинаковое количество визитов и вывести всех посетителей, разделивших первые три места, можно использовать DENSE_RANK():
WITH visitor_stats AS (
SELECT
visitor_name,
COUNT(*) AS visit_count
FROM visits
GROUP BY visitor_name
),
ranked AS (
SELECT
visitor_name,
visit_count,
DENSE_RANK() OVER (
ORDER BY visit_count DESC
) AS place
FROM visitor_stats
)
SELECT
visitor_name,
visit_count
FROM ranked
WHERE place <= 3
ORDER BY visit_count DESC;
В первом варианте результат содержит ровно три строки. Во втором могут быть дополнительные строки, если несколько посетителей имеют одинаковое количество визитов на одном из первых трёх мест.