我使用PL/SQL
,这是我的表
a | b | c | d
-----------------------------
1 | 1 | 2 |
1 | 2 | 2 |
1 | 2 | 2 |
1 | 3 | 2 |
1 | 3 | 2 |
2 | 2 | 2 |
2 | 4 | 2 |
2 | 5 | 1 |
它将成为
a | b | c | d
-----------------------------
1 | 1 | 2 | 1
1 | 2 | 2 | 2
1 | 2 | 2 | 2
1 | 3 | 2 | 3
1 | 3 | 2 | 3
2 | 2 | 2 | 1
2 | 4 | 2 | 2
2 | 5 | 1 |
d
列将从1
开始,然后加1
如果b
列开始更改,
如果a
列不同,d
列将从1
重复开始。
我想更新d
列c
等于2
。
我知道如何使用ROW_NUMBER() OVER (PARTITION BY )
,但我有两个列关系。我不知道。
怎么做?谢谢。
答案 0 :(得分:2)
不幸的是,Oracle更新中的数据操作很痛苦。
这样做你想要的:
update table t
set d = (select count(distinct b)
from table t2
where t2.a = t.a and
t2.b <= t.b
) ;
在select
查询中,您可以使用dense_rank()
。
答案 1 :(得分:0)
你不能在SET
子句中使用窗口函数,我相信你需要使用嵌套查询来获取d的新值。以下内容适用于您:
UPDATE T
SET T.d = D.d
FROM Table1 T
-- Join on a subquery to get the new 'd' values:
INNER JOIN (
SELECT a, b, c, -- Get the identifiers for this row
-- Get the new value for d
dense_rank() over (partition by a
order by b) as d
FROM Table1
) D -- Map the new 'd' values back to the appropriate row
ON T.a = D.a and T.b = D.b AND T.c = D.c