+—————+———+
| Column Name | Type |
+—————+———+
| user_id | int |
| session_id | int |
| activity_date | date |
| activity_type | enum |
+—————+———+
This table may have duplicate rows.
The activity_type column is an ENUM (category) 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 a solution to find the daily active user count for a period of 30 days ending 2019-07-27 inclusively. A user was active on someday if they made at least one activity on that day.
Input:
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 |+---------+------------+---------------+---------------+Output:
+------------+--------------+| day | active_users |+------------+--------------+|2019-07-20|2||2019-07-21|2|+------------+--------------+Explanation: Note that we do not care about days with zero active users.## Solution
### Method 1– Group By and Date Filtering
#### Intuition
We need to count the number of unique users active on each day in the last 30 days ending 2019-07-27. We can filter the date range and group by day.#### Approach
1. Filter the Activity table for dates between 2019-06-28 and 2019-07-27(inclusive).2. For each day, count the distinct user_ids.3. Return the day and active user count.#### Code
1
2
3
4
SELECT activity_date ASday, COUNT(DISTINCT user_id) AS active_users
FROM Activity
WHERE activity_date BETWEEN DATE_SUB('2019-07-27', INTERVAL 29DAY) AND'2019-07-27'GROUPBY activity_date;
1
2
3
4
SELECT activity_date ASday, COUNT(DISTINCT user_id) AS active_users
FROM Activity
WHERE activity_date BETWEEN'2019-07-27'::date - INTERVAL '29 days'AND'2019-07-27'GROUPBY activity_date;
#### Complexity
-⏰ Time complexity:`O(n)`— Each row is processed once.-🧺 Space complexity:`O(1)`— Only a few variables for aggregation.