我需要使用group by在特定属性上更新一个表,然后更新同一个表。
这是我想要实现的目标
样本记录:
表ABC
KEY REF_NO ATT_KEY
1 200 1
2 200 2
3 200 3
4 283 4
5 283 5
6 283 6
7 400 8
8 400 11
我希望看到的输出:按参考编号分组,如果我发现至少其中一个att_key是奇数,那么我必须将所有偶数翻转为偶数 - 1和奇数将保持不变。 att_key(1,2,3 ... 24)的数字集
表ABC输出:
KEY REF_NO ATT_KEY
1 200 1
2 200 1
3 200 3
4 283 3
5 283 5
6 283 5
7 400 7
8 400 11
我很难得到这个逻辑。寻求帮助/建议
...谢谢
答案 0 :(得分:1)
您可以使用窗口功能执行此操作。这种方法使用余数的max()
:
select key, ref_no,
(case when max(mod(att_key, 2)) over (partition by ref_no) = 1 and
mod(att_key, 2) = 0
then att_key - 1
else att_key
end) as newkey
from table t;
我不确定ATT_KEY
上1到24之间的条件在哪里。也许你还需要一个WHERE
条款。
您也可以将其标记为更新:
update t
set att_key = att_key - 1
where mod(att_key, 2) = 0 and
exists (select 1
from t t2
where t.ref_no = t2.ref_no and mod(att_key, 2) = 1
);
答案 1 :(得分:1)
Oracle 11g R2架构设置:
CREATE TABLE ABC ( KEY, REF_NO, ATT_KEY ) AS
SELECT 1, 200, 1 FROM DUAL
UNION ALL SELECT 2, 200, 2 FROM DUAL
UNION ALL SELECT 3, 200, 3 FROM DUAL
UNION ALL SELECT 4, 283, 4 FROM DUAL
UNION ALL SELECT 5, 283, 5 FROM DUAL
UNION ALL SELECT 6, 283, 6 FROM DUAL
UNION ALL SELECT 7, 400, 8 FROM DUAL
UNION ALL SELECT 8, 400, 11 FROM DUAL
UNION ALL SELECT 9, 500, 12 FROM DUAL;
UPDATE ABC a
SET ATT_KEY = ATT_KEY - 1
WHERE MOD( ATT_KEY, 2 ) = 0
AND EXISTS (
SELECT 'X'
FROM ABC b
WHERE MOD( ATT_KEY, 2 ) = 1
AND a.REF_NO = b.REF_NO
);
查询1 :
SELECT *
FROM ABC
<强> Demo 强>:
| KEY | REF_NO | ATT_KEY |
|-----|--------|---------|
| 1 | 200 | 1 |
| 2 | 200 | 1 |
| 3 | 200 | 3 |
| 4 | 283 | 3 |
| 5 | 283 | 5 |
| 6 | 283 | 5 |
| 7 | 400 | 7 |
| 8 | 400 | 11 |
| 9 | 500 | 12 |