PostgreSQL中PARTITION BY与COUNT函数返回值不一致问题咨询
问题分析与解决:PostgreSQL中COUNT与PARTITION BY混用返回值异常
错误原因
你的SQL语句存在执行顺序和用法混淆的问题:
- 执行顺序优先级:PostgreSQL会先执行
GROUP BY name,这一步已经将原表按name分组,每组仅保留1行聚合后的数据(比如Boy组只剩1行,Girl组只剩1行)。 - 窗口函数的作用范围:后续的窗口函数
count(name) OVER (PARTITION BY name)是在GROUP BY处理后的数据集上执行的,此时每个分区(Boy/Girl)内只有1行数据,因此count的结果必然是1。 - 多余的DISTINCT:
GROUP BY已经保证了name的唯一性,DISTINCT在这里没有意义。
正确用法示例
场景1:查看每条原始记录对应的分组总计数
不需要GROUP BY,直接用窗口函数即可:
SELECT name, count(name) OVER (PARTITION BY name) AS group_count FROM sex;
返回结果:
| name | group_count |
|---|---|
| Boy | 3 |
| Boy | 3 |
| Boy | 3 |
| Girl | 1 |
场景2:获取去重后的name及对应计数
有两种等价写法:
- 用
GROUP BY(你最初的正确写法):
SELECT name, count(name) AS group_count FROM sex GROUP BY name;
- 用窗口函数+
DISTINCT(无需GROUP BY):
SELECT DISTINCT name, count(name) OVER (PARTITION BY name) AS group_count FROM sex;
两种写法都会返回:
| name | group_count |
|---|---|
| Boy | 3 |
| Girl | 1 |
内容的提问来源于stack exchange,提问作者Jaymes
相关产品推荐
相关产品推荐

