-
Notifications
You must be signed in to change notification settings - Fork 43
/
user-activity-for-the-past-30-days-i.sql
80 lines (67 loc) · 2.62 KB
/
user-activity-for-the-past-30-days-i.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
/*
https://leetcode.jp/problemdetail.php?id=1141
https://circlecoder.com/user-activity-for-the-past-30-days-I/
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| user_id | int |
| session_id | int |
| activity_date | date |
| activity_type | enum |
+---------------+---------+
There is no primary key for this table, it may have duplicate rows.
The activity_type column is an ENUM of type ('open_session', 'end_session', 'scroll_down', 'send_message').
The table shows the user activities for a social media website.
Note that each session belongs to exactly one user.
Write an SQL query to find the daily active user count for a period of 30 days ending 2019-07-27 inclusively. A user was active on some day if he/she made at least one activity on that day.
The query result format is in the following example:
Activity table:
+---------+------------+---------------+---------------+
| user_id | session_id | activity_date | activity_type |
+---------+------------+---------------+---------------+
| 1 | 1 | 2019-07-20 | open_session |
| 1 | 1 | 2019-07-20 | scroll_down |
| 1 | 1 | 2019-07-20 | end_session |
| 2 | 4 | 2019-07-20 | open_session |
| 2 | 4 | 2019-07-21 | send_message |
| 2 | 4 | 2019-07-21 | end_session |
| 3 | 2 | 2019-07-21 | open_session |
| 3 | 2 | 2019-07-21 | send_message |
| 3 | 2 | 2019-07-21 | end_session |
| 4 | 3 | 2019-06-25 | open_session |
| 4 | 3 | 2019-06-25 | end_session |
+---------+------------+---------------+---------------+
Result table:
+------------+--------------+
| day | active_users |
+------------+--------------+
| 2019-07-20 | 2 |
| 2019-07-21 | 2 |
+------------+--------------+
Note that we do not care about days with zero active users.
*/
# V0
SELECT
activity_date AS day,
COUNT(DISTINCT user_id) AS active_users
FROM
activity
GROUP BY activity_date
HAVING
daydiff("2019-07-27",activity_date) < 30;
ORDER BY day
# V1
# https://circlecoder.com/user-activity-for-the-past-30-days-I/
select activity_date as day, count(distinct user_id) as active_users
from Activity
where activity_date between date_add('2019-07-27', interval -29 day) and '2019-07-27'
group by activity_date
# V2
# Time: O(n)
# Space: O(n)
SELECT activity_date AS day,
Count(DISTINCT user_id) AS active_users
FROM activity
GROUP BY activity_date
HAVING Datediff("2019-07-27", activity_date) < 30
ORDER BY NULL