You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用窗口函数时如何消除查询结果中的重复条目?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:07:36