如何在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
相关产品推荐
相关产品推荐

