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

如何在Oracle查询中调整STATUS列:当CODE组存在STATUS=1记录时统一更新状态

解决Oracle SQL按分组调整状态字段的需求

可以通过窗口函数结合CASE表达式实现需求,以下是修改后的完整查询语句:

SELECT 
    CODE,
    CASE 
        WHEN STATUS = 0 AND MAX(STATUS) OVER (PARTITION BY CODE) = 1 THEN 1
        ELSE STATUS
    END AS STATUS,
    DESCRIPTION,
    CASE 
        WHEN STATUS = 0 AND MAX(STATUS) OVER (PARTITION BY CODE) = 1 THEN 'YES'
        ELSE MODIFIED
    END AS MODIFIED
FROM ( 
    SELECT 'A' CODE, 1 STATUS , 'Z' DESCRIPTION, '' MODIFIED FROM dual UNION ALL 
    SELECT 'A' CODE, 1 STATUS , 'W', '' MODIFIED  FROM dual UNION ALL 
    SELECT 'A' CODE, 0 STATUS , 'F', '' MODIFIED  FROM dual UNION ALL 
    SELECT 'B' CODE, 0 STATUS , 'V', '' MODIFIED  FROM dual UNION ALL 
    SELECT 'B' CODE, 0 STATUS , 'D', '' MODIFIED  FROM dual UNION ALL 
    SELECT 'C' CODE, 1 STATUS , 'S', '' MODIFIED  FROM dual 
) t

逻辑说明:

  • MAX(STATUS) OVER (PARTITION BY CODE):按CODE分组计算每组的最大STATUS值。如果组内存在至少一条STATUS=1的记录,这个值就是1;否则为0。
  • 第一个CASE表达式:判断当前记录的STATUS为0且分组最大STATUS为1时,将STATUS改为1,否则保留原状态。
  • 第二个CASE表达式:仅当原STATUS为0且分组存在STATUS=1的记录时,将MODIFIED设为'YES',其余情况保留原字段值。

执行上述语句后,会得到目标结果:

CODE|STATUS|DESCRIPTION|MODIFIED|
----|------|-----------|--------|
A   |     1|Z          |        |
A   |     1|W          |        |
A   |     1|F          |YES     |
B   |     0|V          |        |
B   |     0|D          |        |
C   |     1|S          |        |

内容的提问来源于stack exchange,提问作者Omari Victor Omosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:39:24