-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcountry-member-details.sql
More file actions
143 lines (143 loc) · 4.01 KB
/
Copy pathcountry-member-details.sql
File metadata and controls
143 lines (143 loc) · 4.01 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
140
141
142
143
WITH member_profiles AS (
SELECT
m."userId" AS user_id,
COALESCE(
NULLIF(TRIM(m."homeCountryCode"), ''),
NULLIF(TRIM(m."competitionCountryCode"), '')
) AS country_code,
m.handle,
m."photoURL" AS photo_url
FROM members.member m
),
country_members AS (
SELECT
country_code,
COUNT(*)::bigint AS members_count
FROM member_profiles
WHERE country_code IS NOT NULL
GROUP BY country_code
),
country_member_skills AS (
SELECT DISTINCT
members.country_code,
members.user_id,
skill.id AS skill_id,
skill.name
FROM member_profiles members
JOIN skills.user_skill user_skill
ON user_skill.user_id::bigint = members.user_id
JOIN skills.user_skill_level skill_level
ON skill_level.id = user_skill.user_skill_level_id
AND LOWER(skill_level.name) IN ('verified', 'self-declared')
JOIN skills.skill skill
ON skill.id = user_skill.skill_id
AND skill.deleted_at IS NULL
WHERE members.country_code IS NOT NULL
),
country_skill_counts AS (
SELECT
owned.country_code,
owned.skill_id,
owned.name,
COUNT(*)::bigint AS owned_count
FROM country_member_skills owned
GROUP BY owned.country_code, owned.skill_id, owned.name
),
country_skills AS (
SELECT
country_code,
JSONB_AGG(
JSONB_BUILD_OBJECT(
'name', name,
'count', owned_count,
'ownedCount', owned_count
)
ORDER BY owned_count DESC, name ASC, skill_id ASC
) AS skills
FROM country_skill_counts
GROUP BY country_code
),
history_wins AS (
SELECT
history."userId",
history."trackId",
history."typeId",
COUNT(*)::bigint AS wins
FROM members."memberStatsHistory" history
WHERE history.placement = 1
GROUP BY history."userId", history."trackId", history."typeId"
),
stats_wins AS (
SELECT
stats."userId",
SUM(COALESCE(stats.wins, history.wins, 0))::bigint AS wins
FROM members."memberStats" stats
LEFT JOIN history_wins history
ON history."userId" = stats."userId"
AND history."trackId" = stats."trackId"
AND history."typeId" = stats."typeId"
LEFT JOIN challenges."ChallengeTrack" track
ON track.id::text = stats."trackId"
WHERE stats."isPrivate" = false
AND (
UPPER(COALESCE(track.name, stats."trackId")) LIKE '%DEVELOP%'
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%DESIGN%'
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%DATA%SCIENCE%'
OR UPPER(COALESCE(track.name, stats."trackId")) = 'QA'
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%QUALITY%ASSURANCE%'
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%COPILOT%'
)
GROUP BY stats."userId"
),
winner_counts AS (
SELECT
members.country_code,
members.user_id,
members.handle,
members.photo_url,
rating.rating AS max_rating,
wins.wins
FROM stats_wins wins
JOIN member_profiles members
ON members.user_id = wins."userId"
LEFT JOIN members."memberMaxRating" rating
ON rating."userId" = members.user_id
WHERE members.country_code IS NOT NULL
AND NULLIF(TRIM(members.handle), '') IS NOT NULL
AND wins.wins > 0
),
ranked_members AS (
SELECT
winner_counts.*,
ROW_NUMBER() OVER (
PARTITION BY country_code
ORDER BY wins DESC, handle ASC, user_id ASC
) AS member_rank
FROM winner_counts
),
top_members AS (
SELECT
country_code,
JSONB_AGG(
JSONB_BUILD_OBJECT(
'handle', handle,
'wins', wins,
'photoURL', photo_url,
'maxRating', max_rating
)
ORDER BY member_rank
) FILTER (WHERE member_rank <= 3) AS top_members
FROM ranked_members
GROUP BY country_code
)
SELECT
countries.country_code,
countries.members_count AS "user.count",
COALESCE(skills.skills, '[]'::jsonb) AS skills,
COALESCE(members.top_members, '[]'::jsonb) AS top_members
FROM country_members countries
LEFT JOIN country_skills skills
ON skills.country_code = countries.country_code
LEFT JOIN top_members members
ON members.country_code = countries.country_code
ORDER BY "user.count" DESC, country_code ASC;