This is an SQL version of the Dashboard Report for Top Users by Likes Received from a User with a Lower Trust Level.
This dashboard report aims to identify which users have received the most likes from members of lower trust levels within a specified timeframe. The report focuses on the interaction between users of different trust levels and highlights accounts that stand out in community engagement by being liked by those with lower permissions or experience on the forum.
--[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 Query Explanation
- Date Parameters:
- The query accepts two parameters,
:start_date
and:end_date
, which define the date range for the report. Both date parameters accept the date format ofYYYY-MM-DD
.
- The query accepts two parameters,
- Common Table Expression (CTE):
- The CTE
user_liked_tl_lower
is defined at the beginning for reuse within the main query. - It calculates the total number of likes each user has received on their posts from users with lower trust levels within the given timeframe defined by
:start_date
and:end_date
.
- The CTE
- Inner Joins:
- Joins are performed between the
users
table and theposts
anduser_actions
tables to filter out the actions that are ‘likes’ (indicated byaction_type = 1
). - An additional join to the
users
table (u_liked
) is made to ensure that the liker has a trust level lower than the post’s author.
- Joins are performed between the
- Ranking:
- Results are partitioned by the user’s trust level and ordered by the count of likes in descending order.
- A ranking is assigned based on the number of likes, with ties receiving the same rank and the next rank skipping numbers accordingly (this is standard ranking, not dense ranking).
- Filtering results in CTE:
- Only the likes that were given within the specified time period are counted.
- Final Selection:
- The main query selects all columns from the CTE where the
rank
is 10 or lower. - This limits the results to the top 10 users in each trust level category that have received the most likes from users of lower trust levels.
- The main query selects all columns from the CTE where the
Example Results
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 |
… | … | … | … |