Топ-3 посетителя по числу визитов

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;

В первом варианте результат содержит ровно три строки. Во втором могут быть дополнительные строки, если несколько посетителей имеют одинаковое количество визитов на одном из первых трёх мест.