Oracle SQL按唯一name分组统计2021年start日期对应记录数问题
错误原因分析
- 你混淆了
WHERE和HAVING的适用场景:HAVING是对分组聚合后的结果进行过滤,只能使用分组字段或者聚合计算生成的字段,所以你把start的筛选放在HAVING里的话,要么要把start放到GROUP BY(就会出现你遇到的name重复问题),要么SQL语法校验不通过报错。 - 日期筛选属于分组前对原始数据的过滤,应该放到
WHERE子句中执行,不需要放到GROUP BY或者HAVING里。
正确SQL写法
SELECT name, COUNT(*) AS Count FROM my_table WHERE start >= '01-JAN-21 01.00.00.000000000 AM' GROUP BY name
如果要更严谨的覆盖2021年全年的数据(避免结束时间漏判),可以加结束时间的限制:
SELECT name, COUNT(*) AS Count FROM my_table WHERE start >= '01-JAN-21 00.00.00.000000000 AM' AND start < '01-JAN-22 00.00.00.000000000 AM' GROUP BY name
执行逻辑说明
- 先通过WHERE子句过滤掉所有非2021年的原始记录(示例中2020年1月的那条State记录会直接被排除)
- 剩下的符合条件的记录只按
name字段分组,统计每个name对应的记录总数,就能得到你要的输出结果。
内容的提问来源于stack exchange,提问作者dataviolet
相关产品推荐
相关产品推荐

