同一天读了至少两篇文章的人
LeetCode 1149 · 多列分组、去重计数
面试怎么回答
按 view_date, viewer_id 分组,HAVING COUNT(DISTINCT article_id) >= 2,再对 viewer_id 去重排序。分组键决定了统计口径,「同一天」就必须把日期放进分组键。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
同一张浏览表,找出在同一天里看过至少两篇不同文章的读者,去重后按 ID 升序。
表结构
- Views:article_id、author_id、viewer_id、view_date;可能有重复行
思路
「同一天」意味着要按(日期, 读者)分组,组内 COUNT(DISTINCT article_id) ≥ 2。一个读者可能在多天都满足条件,所以最后对读者去重。
参考解法
SELECT DISTINCT viewer_id AS id
FROM Views
GROUP BY view_date, viewer_id
HAVING COUNT(DISTINCT article_id) >= 2
ORDER BY viewer_id
易错点
- 只按读者分组就变成「总共读过两篇」,丢掉了「同一天」的约束。
- 同一篇文章读两次不算两篇,要对 article_id 去重。