解决SQL查询单日浏览多篇文章的观众ID返回重复结果问题
修复查询返回重复viewer_id的问题
问题原因
你的SQL子查询按viewer_id和view_date分组,当同一个观众(比如viewer_id=1)在多个日期都满足“当天浏览次数/文章数超过1”的条件时,子查询会返回多条该观众的记录。外层查询直接选取viewer_id,自然会出现重复值。
解决方案
方案1:外层查询添加DISTINCT去重
在最外层查询中加入DISTINCT关键字,直接过滤重复的viewer_id:
SELECT DISTINCT viewer_id FROM ( SELECT viewer_id, view_date, count(article_id) AS number_of_articles FROM playground.views GROUP BY viewer_id, view_date HAVING count(article_id) > 1 ) a ORDER BY viewer_id ASC
方案2:用EXISTS简化查询逻辑
通过EXISTS子查询直接判断观众是否存在同一天浏览不同文章的记录,这种写法天然保证viewer_id唯一:
SELECT DISTINCT v1.viewer_id FROM playground.views v1 WHERE EXISTS ( SELECT 1 FROM playground.views v2 WHERE v1.viewer_id = v2.viewer_id AND v1.view_date = v2.view_date AND v1.article_id != v2.article_id ) ORDER BY v1.viewer_id ASC;
额外优化:精准匹配“多篇不同文章”
如果需求是同一天浏览至少两篇不同的文章(而非多次重复浏览同一篇),原查询的count(article_id)会误判重复浏览的情况。此时需要统计不同的文章ID:
SELECT DISTINCT viewer_id FROM ( SELECT viewer_id, view_date, count(DISTINCT article_id) AS number_of_articles FROM playground.views GROUP BY viewer_id, view_date HAVING count(DISTINCT article_id) > 1 ) a ORDER BY viewer_id ASC
内容的提问来源于stack exchange,提问作者user28577345
相关产品推荐
相关产品推荐

