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

Oracle分组查询:每组首行保留MAX_LIMIT其余置0需求实现

修改Oracle查询实现分组内仅首行保留MAX_LIMIT值

修改后的查询语句

SELECT 
    a.SRNO, 
    a.srno_dtl, 
    a.REPORT_HEAD_NAME, 
    a.current_gl_srno, 
    a.Fixed_gl_srno, 
    NVL((SELECT SUM(NVL(C.CURBAL,0)) 
         FROM GLMAS C 
         WHERE C.BRANCH_CODE='2' 
           AND C.ACC_CODE=a.CURRENT_GL_SRNO 
           AND C.DATE_OP <='04-Sep-2017' 
           AND (C.DATE_CL IS NULL OR C.DATE_CL > '04-Sep-2017')),0) AS MIN_LIMIT, 
    -- 核心修改:仅srno_dtl=1时保留原MAX_LIMIT值,其余行置为0
    CASE 
        WHEN a.srno_dtl = 1 THEN 
            NVL((SELECT SUM(NVL(C.CURBAL,0)) 
                 FROM GLMAS C 
                 WHERE C.BRANCH_CODE='2' 
                   AND C.ACC_CODE=a.FIXED_GL_SRNO 
                   AND C.DATE_OP <='04-Sep-2017' 
                   AND (C.DATE_CL IS NULL OR C.DATE_CL > '04-Sep-2017')),0)
        ELSE 0 
    END AS MAX_LIMIT 
FROM INTER_BANK_EXP_HEAD a 
ORDER BY a.SRNO,a.srno_dtl;

实现思路

  • 基础条件判断:利用现有srno_dtl字段的特性(每个SRNO分组内首行的srno_dtl值为1),通过CASE语句做分支处理:首行保留原本计算的MAX_LIMIT结果,其他行直接返回0。
  • 灵活优化方案:如果后续srno_dtl的编号规则发生变化(比如不是从1开始连续编号),可以改用ROW_NUMBER()窗口函数来精准定位分组内的首行,替换CASE条件为:
    CASE 
        WHEN ROW_NUMBER() OVER(PARTITION BY a.SRNO ORDER BY a.srno_dtl) = 1 THEN 
            -- 原MAX_LIMIT子查询内容
        ELSE 0 
    END AS MAX_LIMIT
    
    这种方式不依赖srno_dtl的具体数值,仅按排序后的首行判断,适用性更强。

执行上述查询后,就能得到你期望的结果:每个SRNO分组仅首行保留原MAX_LIMIT值,其余行MAX_LIMIT置为0。

内容的提问来源于stack exchange,提问作者krunal shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:00:14