使用聚合计数窗口函数筛选同名行的SQL查询问题
解决方案:筛选出具有多个相同name的行
你的原查询已经通过窗口函数计算出了每个name对应的version数量,但缺少关键的筛选步骤——没有过滤掉那些计数≤1的行。要得到你预期的结果,只需要在计算完计数后,再添加一层筛选条件,保留count > 1的行即可。
方法1:使用CTE(公共表表达式)
这种写法可读性更强,适合后续可能扩展的复杂查询:
WITH name_version_counts AS ( SELECT version, name, COUNT(version) OVER (PARTITION BY name) AS count FROM application WHERE id = 123 ) SELECT version, name, count FROM name_version_counts WHERE count > 1;
方法2:使用子查询
如果你的数据库版本不支持CTE,或者更习惯子查询的写法,可以用这个版本:
SELECT version, name, count FROM ( SELECT version, name, COUNT(version) OVER (PARTITION BY name) AS count FROM application WHERE id = 123 ) AS sub_query WHERE count > 1;
补充说明
- 原结果中出现
count = 0的行,是因为这些name对应的version字段为NULL,COUNT(version)会忽略NULL值,所以计数为0。如果需要统计包含NULL版本的总行数,可以把COUNT(version)改成COUNT(*),但根据你的预期结果,当前的COUNT(version)是符合需求的。 - 窗口函数
OVER (PARTITION BY name)会给同一name的所有行都带上相同的计数值,所以外层只需要筛选count > 1,就能把该name下的所有行都保留下来,正好符合你想要的Mouser两行的结果。
内容的提问来源于stack exchange,提问作者Roy Gonen
相关产品推荐
相关产品推荐

