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

SQL中DISTINCT与ROW_NUMBER()窗口函数联用报错求助

问题分析

原查询的语法错误在于DISTINCT关键字的位置——它不能直接跟在某个列的函数前面,DISTINCT是作用于整个SELECT返回的结果集,而非单个列。当你把DISTINCT COUNT(user_id)写在窗口函数ROW_NUMBER()之后,SQL解析器无法识别这种语法,导致查询失败。

你的核心需求是:

  1. 统计2022年1月1日之后,每个用户的发推数量
  2. 对这些发推数量去重(仅保留不同的数值)
  3. 给去重后的每个数值分配唯一行ID(tweet_bucket)
解决方案

可以通过子查询/CTE先完成分组统计,再对结果去重并添加行号,同时满足所有需求。

方法1:使用子查询

SELECT 
    ROW_NUMBER() OVER() AS tweet_bucket,
    users_num
FROM (
    SELECT DISTINCT 
        COUNT(user_id) AS users_num
    FROM tweets
    WHERE tweet_date >= '2022-01-01 00:00:00'
    GROUP BY user_id
) AS user_tweet_counts;

方法2:使用CTE(可读性更强)

WITH user_tweet_counts AS (
    SELECT DISTINCT 
        COUNT(user_id) AS users_num
    FROM tweets
    WHERE tweet_date >= '2022-01-01 00:00:00'
    GROUP BY user_id
)
SELECT 
    ROW_NUMBER() OVER() AS tweet_bucket,
    users_num
FROM user_tweet_counts;

测试结果

基于你提供的测试数据,执行上述查询后会得到:

tweet_bucketusers_num
12
21

说明:用户111在2022年1月1日后发了2条推文,用户254和148各发1条,去重后得到2和1两个数值,分别分配行号1和2。

原写法失效原因
  • 位置错误:SQL规定DISTINCT必须放在SELECT关键字之后、所有列定义的最前面,不能插入到单个列的定义中。
  • 逻辑冲突:如果直接把DISTINCT和ROW_NUMBER()放在同一个SELECT中,ROW_NUMBER()会给每一行(包括重复的users_num)分配唯一ID,导致即使users_num相同,整个结果行因行号不同而成为唯一值,DISTINCT无法起到去重作用。

内容的提问来源于stack exchange,提问作者ayush_maheshwari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:48:29