Это SQL-версия отчета панели управления по топовым пользователям по количеству полученных лайков от пользователей с более низким уровнем доверия.
Данный отчет направлен на выявление пользователей, получивших наибольшее количество лайков от членов сообщества с более низким уровнем доверия в течение указанного периода. Отчет фокусируется на взаимодействии между пользователями разных уровней доверия и выделяет аккаунты, которые выделяются в вовлеченности сообщества, получая лайки от тех, у кого ниже права или опыт на форуме.
--[params]
--date :start_date = 2024-01-01
--date :end_date = 2025-01-01
WITH user_liked_tl_lower AS (
SELECT
users.id AS user_id,
users.username,
users.trust_level,
COUNT(*) AS likes,
rank() OVER (
PARTITION BY users.trust_level
ORDER BY COUNT(*) DESC
) AS rank
FROM users
INNER JOIN posts p ON p.user_id = users.id
INNER JOIN user_actions ua ON ua.target_post_id = p.id AND ua.action_type = 1
INNER JOIN users u_liked ON ua.user_id = u_liked.id AND u_liked.trust_level < users.trust_level
WHERE ua.created_at::date BETWEEN :start_date AND :end_date
GROUP BY users.id
ORDER BY trust_level DESC, likes DESC
)
SELECT * FROM user_liked_tl_lower
WHERE rank <= 10
Пояснение к SQL-запросу
- Параметры даты:
- Запрос принимает два параметра:
:start_dateи:end_date, которые определяют диапазон дат для отчета. Оба параметра даты принимают форматГГГГ-ММ-ДД.
- Запрос принимает два параметра:
- Общее табличное выражение (CTE):
- CTE
user_liked_tl_lowerопределено в начале для повторного использования в основном запросе. - Оно вычисляет общее количество лайков, полученных каждым пользователем на своих постах от пользователей с более низким уровнем доверия в течение заданного периода, определенного параметрами
:start_dateи:end_date.
- CTE
- Внутренние соединения (Inner Joins):
- Выполняются соединения между таблицами
users,postsиuser_actionsдля фильтрации действий, являющихся «лайками» (обозначаетсяaction_type = 1). - Дополнительное соединение с таблицей
users(u_liked) используется для обеспечения того, чтобы пользователь, поставивший лайк, имел уровень доверия ниже, чем автор поста.
- Выполняются соединения между таблицами
- Ранжирование:
- Результаты разбиваются на группы по уровню доверия пользователя и сортируются по количеству лайков в порядке убывания.
- Присваивается ранг на основе количества лайков; при равенстве ранги одинаковы, а следующий ранг пропускает соответствующие числа (это стандартное ранжирование, а не плотное).
- Фильтрация результатов в CTE:
- Учитываются только лайки, поставленные в указанный период времени.
- Финальный выбор:
- Основной запрос выбирает все столбцы из CTE, где
rankменьше или равен 10. - Это ограничивает результаты топ-10 пользователей в каждой категории уровня доверия, получивших наибольшее количество лайков от пользователей с более низким уровнем доверия.
- Основной запрос выбирает все столбцы из CTE, где
Пример результатов
| user | username | trust_level | likes | rank |
|---|---|---|---|---|
| user1 | user1 | 4 | 323 | 1 |
| user2 | user2 | 4 | 164 | 2 |
| user3 | user3 | 4 | 143 | 3 |
| … | … | … | … | |
| user11 | user11 | 3 | 45 | 1 |
| user12 | user12 | 3 | 34 | 2 |
| … | … | … | …"} |