SQL practice #4

Leetcode 1113. Reported Posts

Posted by Minyoung Jeong on September 16, 2020
SQL practice

Table: Actions

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| post_id       | int     |
| action_date   | date    | 
| action        | enum    |
| extra         | varchar |
+---------------+---------+
There is no primary key for this table, it may have duplicate rows.
The action column is an ENUM type of ('view', 'like', 'reaction', 'comment', 'report', 'share').
The extra column has optional information about the action such as a reason for report or a type of reaction. 

Write an SQL query that reports the number of posts reported yesterday for each report reason. Assume today is 2019-07-05.

The query result format is in the following example:

Actions table:
+---------+---------+-------------+--------+--------+
| 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 |
+---------+---------+-------------+--------+--------+
Result table:
+---------------+--------------+
| report_reason | report_count |
+---------------+--------------+
| spam          | 1            |
| racism        | 2            |
+---------------+--------------+ 

Note that we only care about report reasons with non zero number of reports.

My solution
Db-fiddle for this problem

The key thing to catch is that the initial group by results in two 'racist' posts with the post_id 2 and 5. So we need to perform group by on the extra feature one more time.

select temp.extra as report_reason, count(temp.extra) as report_count
from (select extra
from Actions
where action_date = '2019-07-04' and extra != 'None'
group by extra,post_id) temp
group by temp.extra;

Simpler solution : not mine

I missed the action type feature.. With using the action type, one can do only one group by.

select extra as report_reason, count(distinct post_id) as report_count from Actions where action_date = '2019-07-04' and action = 'report' group by extra;