You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 10:13:14