-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathanalytics_queries.sql
More file actions
139 lines (120 loc) · 3.99 KB
/
analytics_queries.sql
File metadata and controls
139 lines (120 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
-- 1. Total user count
SELECT COUNT(*) AS total_users FROM users;
-- 2. Total posts
SELECT COUNT(*) AS total_posts FROM posts;
-- 3. Most liked posts
SELECT p.post_id, p.content, COUNT(l.like_id) AS likes
FROM posts p
LEFT JOIN likes l ON p.post_id = l.post_id
GROUP BY p.post_id
ORDER BY likes DESC;
-- 4. Most commented posts
SELECT p.post_id, p.content, COUNT(c.comment_id) AS comments
FROM posts p
LEFT JOIN comments c ON p.post_id = c.post_id
GROUP BY p.post_id
ORDER BY comments DESC;
-- 5. Follower count per user
SELECT u.username, COUNT(f.follower_id) AS followers
FROM users u
LEFT JOIN follows f ON u.user_id = f.following_id
GROUP BY u.user_id
ORDER BY followers DESC;
-- 6. Following count per user
SELECT u.username, COUNT(f.following_id) AS following
FROM users u
LEFT JOIN follows f ON u.user_id = f.follower_id
GROUP BY u.user_id
ORDER BY following DESC;
-- 7. Engagement score (likes + comments)
SELECT p.post_id, p.content,
COUNT(DISTINCT l.like_id) + COUNT(DISTINCT c.comment_id) AS engagement_score
FROM posts p
LEFT JOIN likes l ON p.post_id = l.post_id
LEFT JOIN comments c ON p.post_id = c.post_id
GROUP BY p.post_id
ORDER BY engagement_score DESC;
-- 8. Most active users (posts + likes + comments)
SELECT u.username,
(SELECT COUNT(*) FROM posts WHERE user_id = u.user_id) +
(SELECT COUNT(*) FROM likes WHERE user_id = u.user_id) +
(SELECT COUNT(*) FROM comments WHERE user_id = u.user_id) AS activity_score
FROM users u
ORDER BY activity_score DESC;
-- 9. Mutual followers
SELECT u1.username AS user_a, u2.username AS user_b
FROM follows f1
JOIN follows f2
ON f1.follower_id = f2.following_id
AND f1.following_id = f2.follower_id
JOIN users u1 ON u1.user_id = f1.follower_id
JOIN users u2 ON u2.user_id = f1.following_id;
-- 10. Users who never posted
SELECT username FROM users
WHERE user_id NOT IN (SELECT user_id FROM posts);
-- 11. Top commenters
SELECT u.username, COUNT(c.comment_id) AS comments_made
FROM comments c
JOIN users u ON u.user_id = c.user_id
GROUP BY u.username
ORDER BY comments_made DESC;
-- 12. Posts liked by each user
SELECT u.username, p.content
FROM likes l
JOIN users u ON u.user_id = l.user_id
JOIN posts p ON p.post_id = l.post_id
ORDER BY u.username;
-- 13. Comments per user
SELECT u.username, COUNT(c.comment_id) AS comments
FROM users u
LEFT JOIN comments c ON u.user_id = c.user_id
GROUP BY u.username;
-- 14. Users with no followers
SELECT username
FROM users
WHERE user_id NOT IN (SELECT following_id FROM follows);
-- 15. Ranking users by followers
SELECT username, followers,
RANK() OVER (ORDER BY followers DESC) AS rank
FROM (
SELECT u.username, COUNT(f.follower_id) AS followers
FROM users u
LEFT JOIN follows f ON u.user_id = f.following_id
GROUP BY u.user_id
) ranked;
-- 16. Engagement received by users
SELECT u.username,
COUNT(l.like_id) + COUNT(c.comment_id) AS engagement_received
FROM users u
LEFT JOIN posts p ON p.user_id = u.user_id
LEFT JOIN likes l ON l.post_id = p.post_id
LEFT JOIN comments c ON c.post_id = p.post_id
GROUP BY u.username
ORDER BY engagement_received DESC;
-- 17. Posts per user
SELECT u.username, COUNT(p.post_id) AS post_count
FROM users u
LEFT JOIN posts p ON u.user_id = p.user_id
GROUP BY u.username;
-- 18. Users who liked their own posts
SELECT u.username, p.post_id
FROM likes l
JOIN posts p ON p.post_id = l.post_id
JOIN users u ON u.user_id = l.user_id
WHERE p.user_id = l.user_id;
-- 19. Most liked user (likes received)
SELECT u.username, COUNT(l.like_id) AS total_likes_received
FROM users u
JOIN posts p ON p.user_id = u.user_id
LEFT JOIN likes l ON p.post_id = l.post_id
GROUP BY u.username
ORDER BY total_likes_received DESC;
-- 20. Post-to-follower ratio per user
SELECT u.username,
COUNT(p.post_id) AS total_posts,
COUNT(f.follower_id) AS followers,
ROUND(COUNT(p.post_id)::decimal / NULLIF(COUNT(f.follower_id), 0), 2) AS ratio
FROM users u
LEFT JOIN posts p ON p.user_id = u.user_id
LEFT JOIN follows f ON f.following_id = u.user_id
GROUP BY u.user_id, u.username;