关于GROUP BY后外层查询是否需DISTINCT的SQL技术咨询
问题解答
你的理解完全正确,外层查询里不需要使用DISTINCT。
原因分析
CTE search_agg 中通过 GROUP BY user_id 进行分组,这已经确保了结果集中的 user_id 是唯一的——每个用户ID只会在结果里出现一次。因此外层查询直接统计行数就能得到符合条件的唯一用户数量,COUNT(user_id) 或者更简洁的 COUNT(*) 和 COUNT(DISTINCT user_id) 得到的结果完全一致。
关于保留DISTINCT的情况
保留 DISTINCT 不会导致结果错误,但属于冗余操作:数据库会额外执行一次去重逻辑,哪怕当前结果集里根本没有重复的 user_id,这会无端增加不必要的计算开销,尤其是当 search_agg 的结果集较大时,可能影响查询效率。
优化后的查询语句
可以把外层查询改成更高效的写法:
WITH search_agg as( SELECT user_id, count(search_id) as count_search FROM search WHERE date>current_date -interval '7 days' GROUP BY user_id HAVING count_search>10) SELECT COUNT(*) FROM search_agg
内容的提问来源于stack exchange,提问作者Chris90
相关产品推荐
相关产品推荐

