Oracle查询获取唯一年月:GROUP BY无法生效问题求助
搞定你的GROUP BY问题
看起来你是想从tst_result_main表里提取唯一的年月组合对吧?之前加GROUP BY报错,大概率是因为没遵循GROUP BY的语法规则——咱们一步步来解决:
两种可行的解决方案
方案1:正确使用GROUP BY
大部分数据库要求SELECT里的非聚合字段必须全部放到GROUP BY里,所以你需要把提取出的m和y都加进去,同时保持排序逻辑:
SELECT EXTRACT(month from datetime_insert) m, EXTRACT(year from datetime_insert) y FROM tst_result_main GROUP BY m, y ORDER BY y, m;
要是你的数据库对别名支持不太友好,也可以直接用提取表达式分组:
SELECT EXTRACT(month from datetime_insert) m, EXTRACT(year from datetime_insert) y FROM tst_result_main GROUP BY EXTRACT(month from datetime_insert), EXTRACT(year from datetime_insert) ORDER BY EXTRACT(year from datetime_insert), EXTRACT(month from datetime_insert);
方案2:用DISTINCT更简洁
如果只是要去重得到唯一的年月对,DISTINCT其实更直接,不需要分组:
SELECT DISTINCT EXTRACT(month from datetime_insert) m, EXTRACT(year from datetime_insert) y FROM tst_result_main ORDER BY y, m;
为啥之前的GROUP BY会报错?
不同数据库的GROUP BY规则有差异,像PostgreSQL、SQL Server这类是严格模式:SELECT里出现的非聚合列(也就是这里的m和y)必须全部出现在GROUP BY子句中,不然数据库不知道该返回哪一行的结果。你之前的错误应该就是没把两个字段都加到GROUP BY里导致的。
另外排序的时候直接按y(年份)和m(月份)来,比按原datetime_insert排序更清晰,结果也完全符合你的预期~
内容的提问来源于stack exchange,提问作者Maxqueue
相关产品推荐
相关产品推荐

