3089. Find Bursty Behavior π
Description
Table: Posts
+-------------+---------+ | Column Name | Type | +-------------+---------+ | post_id | int | | user_id | int | | post_date | date | +-------------+---------+ post_id is the primary key (column with unique values) for this table. Each row of this table contains post_id, user_id, and post_date.
Write a solution to find users who demonstrate bursty behavior in their posting patterns during February 2024
. Bursty behavior is defined as any period of 7 consecutive days where a user's posting frequency is at least twice to their average weekly posting frequency for February 2024
.
Note: Only include the dates from February 1
to February 28
in your analysis, which means you should count February as having exactly 4
weeks.
Return the result table orderd by user_id
in ascending order.
The result format is in the following example.
Example:
Input:
Posts table:
+---------+---------+------------+ | post_id | user_id | post_date | +---------+---------+------------+ | 1 | 1 | 2024-02-27 | | 2 | 5 | 2024-02-06 | | 3 | 3 | 2024-02-25 | | 4 | 3 | 2024-02-14 | | 5 | 3 | 2024-02-06 | | 6 | 2 | 2024-02-25 | +---------+---------+------------+
Output:
+---------+----------------+------------------+ | user_id | max_7day_posts | avg_weekly_posts | +---------+----------------+------------------+ | 1 | 1 | 0.2500 | | 2 | 1 | 0.2500 | | 5 | 1 | 0.2500 | +---------+----------------+------------------+
Explanation:
- User 1: Made only 1 post in February, resulting in an average of 0.25 posts per week and a max of 1 post in any 7-day period.
- User 2: Also made just 1 post, with the same average and max 7-day posting frequency as User 1.
- User 5: Like Users 1 and 2, User 5 made only 1 post throughout February, leading to the same average and max 7-day posting metrics.
- User 3: Although User 3 made more posts than the others (3 posts), they did not reach twice the average weekly posts in their consecutive 7-day window, so they are not listed in the output.
Note: Output table is ordered by user_id in ascending order.
Solutions
Solution 1: Self-Join + Group Count
We can use self-join to connect the Posts
table with itself. The connection condition is p1.user_id = p2.user_id
and p2.post_date
is between p1.post_date
and 6 days after p1.post_date
. Then we group the connection results by p1.user_id
and p1.post_id
to count the number of posts for each user within 7 days of each day. We save this result in table P
.
Next, we count the average number of posts per week for each user in February 2024 and save it in table T
. Note that we need to find records where post_date
is between 2024-02-01
and 2024-02-28
, group the records by user_id
, then count the number of posts for each user, and finally divide by 4
to get the average number of posts per week. We save this result in table T
.
Finally, we connect tables P
and T
with the condition P.user_id = T.user_id
, then group by user_id
to count the maximum number of posts within 7 days for each user. We then filter out records that meet the condition max_7day_posts >= avg_weekly_posts * 2
to get the result. Note that we need to sort in ascending order by user_id
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
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 |
|