使用窗口函数时如何消除查询结果中的重复条目?
解决SQL查询中每个用户仅显示一条记录的问题
首先明确核心矛盾:你需要用vote_date过滤记录,但最终结果不需要重复的name,直接GROUP BY name会因为vote_date未被聚合或加入分组报错,去掉vote_date又无法完成过滤。下面给你几种针对性的解决方案:
方案1:保留原总票数逻辑(总票数为用户所有日期的投票总和)
如果你的total_votes是用户所有投票日期的总票数,只是需要筛选出「有2023-01-01之后投票记录且总票数>4」的用户,每个用户只显示一条记录,可以用DISTINCT去重:
SELECT DISTINCT name, total_votes FROM ( SELECT name, vote_date , SUM(votes) OVER (PARTITION BY name) AS total_votes FROM table ) AS subq WHERE vote_date > '2023-01-01' AND total_votes > 4;
原理:同一用户的total_votes是固定值,DISTINCT会自动去除重复的name+total_votes组合,最终每个用户只留一条记录。
方案2:先筛选符合日期条件的用户,再计算总票数
这种方式逻辑更清晰,先找出所有在2023-01-01之后有投票的用户,再计算他们的总票数并筛选>4的:
SELECT name, SUM(votes) AS total_votes FROM table WHERE name IN ( SELECT DISTINCT name FROM table WHERE vote_date > '2023-01-01' ) GROUP BY name HAVING SUM(votes) > 4;
方案3:总票数仅统计2023-01-01之后的投票
如果你的需求是total_votes只计算用户在2023-01-01之后的投票总和,那可以直接简化查询,不需要子查询:
SELECT name, SUM(votes) AS total_votes FROM table WHERE vote_date > '2023-01-01' GROUP BY name HAVING SUM(votes) > 4;
这个查询直接过滤日期后分组计算,自动每个用户一条记录,同时满足总票数>4的条件。
为什么之前的GROUP BY会报错?
当你GROUP BY name时,查询结果里的每个字段要么是GROUP BY里的字段(这里是name),要么是被聚合函数处理过的字段(比如SUM(votes))。你之前的查询里vote_date既不在GROUP BY里,也没有用MAX()/MIN()这类聚合函数,数据库不知道该返回该用户的哪一个投票日期,所以抛出错误。
内容的提问来源于stack exchange,提问作者drum
相关产品推荐
相关产品推荐

