订阅更新

昨天每种举报理由的帖子数

SQL 实战 123 题 · 第 62 题 简单 约 2 分钟读完

LeetCode 1113 · 条件过滤、去重计数

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

WHERE action = 'report' AND action_date = '2019-07-04',按 extra 分组 COUNT(DISTINCT post_id)。统计「帖子数」就要按帖子去重,这是指标口径问题,写 SQL 前先和需求方确认。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

题意

行为表记录用户对帖子的各种操作,举报(report)操作的附加字段是举报理由。假设今天是 2019-07-05,统计昨天每种举报理由被举报的帖子数。

表结构

  • Actions:user_id、post_id、action_date、action(view / like / reaction / comment / report / share)、extra(可为空);没有主键

思路

过滤出 action = report 且日期是昨天的记录,按举报理由分组,对帖子去重计数(同一帖子被多人举报只算一次)。

参考解法

SELECT
    extra AS report_reason,
    COUNT(distinct post_id) AS report_count
FROM
    Actions
WHERE
    `action` = 'report' AND action_date = date_add('2019-07-05',Interval -1 day)
GROUP BY
    extra;

易错点

  • 用 COUNT(*) 会把同一帖子的多次举报算多次,题目要的是帖子数。
刷题进度保存在当前浏览器