我有一个包含3列的表格如下:
col1 col2 col3
---- ---- ----
1 1 null
2 2 null
3 3 null
4 1 null
5 1 null
6 1 null
7 2 null
ETC
我需要更新同一个表中的第三列,如下所示:
col1 col2 col3
---- ---- ----
1 1 1
2 2 1
3 3 1
4 1 2
5 1 3
6 1 4
7 2 4
更新背后的逻辑是,每当第二列包含1时,第三列必须递增。第一列只是一个连续的整数列。
答案 0 :(得分:0)
您可以使用row_number分析函数按顺序对col2 = 1的行进行编号,然后使用子查询查找最接近的值,其他行的col1值较低。
所以给出一个像这样的测试表:
create table t (c1 int, c2 int, c3 int);
insert t (c1, c2) values
(1, 1),
(2, 2),
(3, 3),
(4, 1),
(5, 1),
(6, 1),
(7, 2);
像这样的查询:
;with cte as (
select t.c1, t.c2, x.c3
from t
left join (
select c1, c2, row_number() over (partition by c2 order by c1) c3
from t
where c2 = 1
) x on t.c1 = x.c1
)
update t
set t.c3 = coalesce(cte1.c3,(select max(cte2.c3) from cte cte2 where cte2.c1 < cte1.c1))
from cte cte1
where t.c1 = cte1.c1
将给出以下结果:
c1 c2 c3
1 1 1
2 2 1
3 3 1
4 1 2
5 1 3
6 1 4
7 2 4
另一种可能更快的方法是:
update t1 set c3 = (select count(*) from t where c2 = 1 and c1 <= t1.c1) from t t1