Oracle SQL按年份优先再月份排序日期分组结果的实现
Oracle SQL 按年月自然排序统计请求数
现有按Month_Year格式分组统计请求数的Oracle SQL查询:
SELECT TO_CHAR (D_DATE, 'MON') || '_' || TO_CHAR (D_DATE, 'YYYY') Month_Year, COUNT (*) Request_Count FROM MY_TABLE WHERE V_TYPE='ABCD' GROUP BY TO_CHAR (D_DATE, 'MON') || '_' || TO_CHAR (D_DATE, 'YYYY') ORDER BY 1;
当前查询按Month_Year字符串的字母顺序排序,输出结果不符合年份优先、月份次之的自然排序需求:
MAR_2023 2223 FEB_2023 433 MAY_2022 10 APR_2022 77
解决方案
无需拆分年份和月份为单独分组列,只需修改ORDER BY子句,通过以下两种方式即可实现目标排序:
方案1:基于Month_Year字段解析排序
利用TO_DATE将字符串格式的Month_Year转换为日期,再提取年份和月份分别排序:
SELECT TO_CHAR (D_DATE, 'MON') || '_' || TO_CHAR (D_DATE, 'YYYY') Month_Year, COUNT (*) Request_Count FROM MY_TABLE WHERE V_TYPE='ABCD' GROUP BY TO_CHAR (D_DATE, 'MON') || '_' || TO_CHAR (D_DATE, 'YYYY') ORDER BY EXTRACT(YEAR FROM TO_DATE(Month_Year, 'MON_YYYY')) DESC, EXTRACT(MONTH FROM TO_DATE(Month_Year, 'MON_YYYY')) ASC;
方案2:基于原始D_DATE字段生成排序依据
直接对原始日期字段截断到月份,按年份降序、月份升序排序(每个分组对应唯一月份,无需修改GROUP BY):
SELECT TO_CHAR (D_DATE, 'MON') || '_' || TO_CHAR (D_DATE, 'YYYY') Month_Year, COUNT (*) Request_Count FROM MY_TABLE WHERE V_TYPE='ABCD' GROUP BY TO_CHAR (D_DATE, 'MON') || '_' || TO_CHAR (D_DATE, 'YYYY') ORDER BY EXTRACT(YEAR FROM TRUNC(D_DATE, 'MON')) DESC, EXTRACT(MONTH FROM TRUNC(D_DATE, 'MON')) ASC;
两种方案均可得到符合需求的输出:
FEB_2023 433 MAR_2023 2223 APR_2022 77 MAY_2022 10
内容的提问来源于stack exchange,提问作者Shanij P.S
相关产品推荐
相关产品推荐

