Description
Table: Actions
| Column Name | Type |
|---|---|
| user_id | int |
| post_id | int |
| action_date | date |
| action | enum |
| extra | varchar |
- This table may have duplicate rows.
- The
actioncolumn is an ENUM (category) type of (‘view’, ’like’, ‘reaction’, ‘comment’, ‘report’, ‘share’). - The
extracolumn has optional information about theaction, such as a reason for the report or a type of reaction. extrais neverNULL.
Problem Statement
Write a solution to report the number of posts reported yesterday for each report reason. Assume today is 2019-07-05.
Return the result table in any order. The result format is in the following example.
Example 1:
Input:
Actionstable:
| user_id | post_id | action_date | action | extra |
|---|---|---|---|---|
| 1 | 1 | 2019-07-01 | view | null |
| 1 | 1 | 2019-07-01 | like | null |
| 1 | 1 | 2019-07-01 | share | null |
| 2 | 4 | 2019-07-04 | view | null |
| 2 | 4 | 2019-07-04 | report | spam |
| 3 | 4 | 2019-07-04 | view | null |
| 3 | 4 | 2019-07-04 | report | spam |
| 4 | 3 | 2019-07-02 | view | null |
| 4 | 3 | 2019-07-02 | report | spam |
| 5 | 2 | 2019-07-04 | view | null |
| 5 | 2 | 2019-07-04 | report | racism |
| 5 | 5 | 2019-07-04 | view | null |
| 5 | 5 | 2019-07-04 | report | racism |
Output:
| report_reason | report_count |
|---|---|
| spam | 1 |
| racism | 2 |
Explanation:
- Note that we only care about report reasons with non-zero number of reports.
Solution
Here, you need to report the number of posts reported yesterday for each report reason. You can filter the action_date to filter the last 1 day posts using action_date >= DATE_SUB('2019-07-05', INTERVAL 1 DAY) AND action_date < '2019-07-05'.
For each report reason, you need to count the number of unique post_id. If you simply count number of records, you may get wrong result because the post_id=4 was reported twice for the same reason (spam). That’s why you should use COUNT(DISTINCT post_id).
1SELECT extra AS report_reason, COUNT(DISTINCT post_id) AS report_count
2 FROM Actions
3 WHERE action='report' AND action_date >= DATE_SUB('2019-07-05', INTERVAL 1 DAY) AND action_date < '2019-07-05'
4 GROUP BY report_reason;


Comments