-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy path2_sql_tasks.sql
243 lines (218 loc) · 5.96 KB
/
2_sql_tasks.sql
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
---
SELECT COUNT(id)
FROM stackoverflow.posts
WHERE post_type_id=1
AND (score>300 OR favorites_count >= 100)
GROUP BY post_type_id;
---
SELECT ROUND(AVG(t.count),0)
FROM (
SELECT COUNT(id),
creation_date::date
FROM stackoverflow.posts
WHERE post_type_id = 1
GROUP BY creation_date::date
HAVING creation_date::date BETWEEN '2008-11-01' AND '2008-11-18') AS t;
---
SELECT COUNT(DISTINCT u.id)
FROM stackoverflow.badges AS b
JOIN stackoverflow.users AS u ON b.user_id=u.id
WHERE b.creation_date::date = u.creation_date::date;
---
SELECT COUNT(t.id)
FROM (
SELECT p.id
FROM stackoverflow.posts AS p
JOIN stackoverflow.votes AS v ON p.id = v.post_id
JOIN stackoverflow.users AS u ON p.user_id = u.id
WHERE u.display_name LIKE 'Joel Coehoorn'
GROUP BY p.id
HAVING COUNT(v.id)>=1) as t;
---
SELECT *,
ROW_NUMBER() OVER(ORDER BY id DESC) AS rank
FROM stackoverflow.vote_types
ORDER BY id;
---
SELECT *
FROM (
SELECT v.user_id,
COUNT(vt.id) AS cnt
FROM stackoverflow.votes AS v
JOIN stackoverflow.vote_types as vt ON vt.id = v.vote_type_id
WHERE vt.name LIKE 'Close'
GROUP BY v.user_id
ORDER BY cnt DESC LIMIT 10
) AS t
ORDER BY t.cnt DESC, t.user_id DESC;
---
SELECT *,
DENSE_RANK() OVER (ORDER BY t.cnt DESC) AS n
FROM (SELECT COUNT(id) AS cnt,
user_id
FROM stackoverflow.badges
WHERE creation_date::date BETWEEN '2008-11-15' AND '2008-12-15'
GROUP BY 2
ORDER BY cnt DESC, user_id LIMIT 10) as t;
---
WITH t AS (
SELECT ROUND(AVG(score)) AS avg_score,
user_id
FROM stackoverflow.posts
WHERE title IS NOT NULL
AND score <> 0
GROUP BY user_id
)
SELECT p.title,
t.user_id,
p.score,
t.avg_score
FROM t
JOIN stackoverflow.posts AS p ON t.user_id=p.user_id
WHERE p.title IS NOT NULL
AND p.score <> 0;
---
SELECT title
FROM stackoverflow.posts
WHERE user_id IN (
SELECT user_id
FROM stackoverflow.badges
GROUP BY user_id
HAVING COUNT(id) >1000
)
AND title IS NOT NULL;
---
SELECT id,
views,
CASE
WHEN views>=350 THEN 1
WHEN views<100 THEN 3
ELSE 2
END AS group
FROM stackoverflow.users
WHERE location LIKE '%United States%'
AND views > 0;
---
WITH tab AS
(SELECT t.id,
t.views,
t.group,
MAX(t.views) OVER (PARTITION BY t.group) AS max
FROM (SELECT id,
views,
CASE
WHEN views>=350 THEN 1
WHEN views<100 THEN 3
ELSE 2
END AS group
FROM stackoverflow.users
WHERE location LIKE '%United States%'
AND views > 0
) as t
)
SELECT tab.id,
tab.views,
tab.group
FROM tab
WHERE tab.views = tab.max
ORDER BY tab.views DESC, tab.id;
---
SELECT *,
SUM(t.cnt_id) OVER (ORDER BY t.days) as nn
FROM (
SELECT EXTRACT(DAY FROM creation_date::date) AS days,
COUNT(id) AS cnt_id
FROM stackoverflow.users
WHERE creation_date::date BETWEEN '2008-11-01' AND '2008-11-30'
GROUP BY EXTRACT(DAY FROM creation_date::date)
) as t;
---
WITH p AS
(SELECT DISTINCT user_id,
MIN(creation_date) OVER (PARTITION BY user_id) AS min_dt
FROM stackoverflow.posts
)
SELECT p.user_id,
(p.min_dt - u.creation_date) AS diff
FROM stackoverflow.users AS u
JOIN p ON u.id = p.user_id;
---
SELECT SUM(views_count),
DATE_TRUNC('month', creation_date)::date AS mnth
FROM stackoverflow.posts
GROUP BY DATE_TRUNC('month', creation_date)::date
ORDER BY SUM(views_count) DESC;
---
SELECT u.display_name,
COUNT(DISTINCT p.user_id)
FROM stackoverflow.posts AS p
JOIN stackoverflow.users AS u ON p.user_id = u.id
JOIN stackoverflow.post_types AS pt ON pt.id = p.post_type_id
WHERE p.creation_date::date BETWEEN u.creation_date::date AND (u.creation_date::date + INTERVAL '1 month')
AND pt.type LIKE '%Answer%'
GROUP BY u.display_name
HAVING COUNT(p.id) > 100
ORDER BY u.display_name;
---
WITH t AS (
SELECT u.id
FROM stackoverflow.posts AS p
JOIN stackoverflow.users AS u ON p.user_id = u.id
WHERE DATE_TRUNC('month', u.creation_date)::date = '2008-09-01'
AND DATE_TRUNC('month', p.creation_date)::date = '2008-12-01'
GROUP BY u.id
HAVING COUNT(p.id)>0
)
SELECT COUNT(p.id),
DATE_TRUNC('month', p.creation_date)::date
FROM stackoverflow.posts AS p
WHERE p.user_id IN (SELECT * FROM t)
AND DATE_TRUNC('year', p.creation_date)::date = '2008-01-01'
GROUP BY DATE_TRUNC('month', p.creation_date)::date
ORDER BY DATE_TRUNC('month', p.creation_date)::date DESC;
---
SELECT user_id,
creation_date,
views_count,
SUM(views_count) OVER (PARTITION BY user_id ORDER BY creation_date)
FROM stackoverflow.posts;
---
SELECT ROUND(AVG(t.cnt))
FROM (
SELECT user_id,
COUNT(DISTINCT creation_date::date) AS cnt
FROM stackoverflow.posts
WHERE creation_date::date BETWEEN '2008-12-01' AND '2008-12-07'
GROUP BY user_id
) AS t
---
WITH t AS (
SELECT EXTRACT(MONTH from creation_date::date) AS month,
COUNT(DISTINCT id)
FROM stackoverflow.posts
WHERE creation_date::date BETWEEN '2008-09-01' AND '2008-12-31'
GROUP BY month
)
SELECT *,
ROUND(((count::numeric / LAG(count) OVER (ORDER BY month)) - 1) * 100,2) AS user_growth
FROM t;
---
WITH t AS (
SELECT user_id,
COUNT(DISTINCT id) AS cnt
FROM stackoverflow.posts
GROUP BY user_id
ORDER BY cnt DESC
LIMIT 1),
t1 AS (
SELECT p.user_id,
p.creation_date,
extract('week' from p.creation_date) AS week_number
FROM stackoverflow.posts AS p
JOIN t ON t.user_id = p.user_id
WHERE DATE_TRUNC('month', p.creation_date)::date = '2008-10-01'
)
SELECT DISTINCT week_number::numeric,
MAX(creation_date) OVER (PARTITION BY week_number)
FROM t1
ORDER BY week_number;