Sql 使用其他列更新列
我使用PL/SQL,这是我的表Sql 使用其他列更新列,sql,oracle,Sql,Oracle,我使用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 |
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列开始更改
如果一列变得不同,d列将从1开始重复
我想用c等于2来更新d列
我知道如何在分区上使用行数,但我有两列关系。我不知道
怎么做?非常感谢。不幸的是,Oracle更新中的数据操作令人痛苦 这正是您想要的:
update table t
set d = (select count(distinct b)
from table t2
where t2.a = t.a and
t2.b <= t.b
) ;
在select查询中,您可以使用稠密的秩来执行此操作。因为您不能在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