SQL中DISTINCT与ROW_NUMBER()窗口函数联用报错求助
问题分析
原查询的语法错误在于DISTINCT关键字的位置——它不能直接跟在某个列的函数前面,DISTINCT是作用于整个SELECT返回的结果集,而非单个列。当你把DISTINCT COUNT(user_id)写在窗口函数ROW_NUMBER()之后,SQL解析器无法识别这种语法,导致查询失败。
你的核心需求是:
- 统计2022年1月1日之后,每个用户的发推数量
- 对这些发推数量去重(仅保留不同的数值)
- 给去重后的每个数值分配唯一行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_bucket | users_num |
|---|---|
| 1 | 2 |
| 2 | 1 |
说明:用户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
相关产品推荐
相关产品推荐

