列按顺序更新

时间:2015-04-23 14:12:58

标签: sql sql-server-2008

我有一个包含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时,第三列必须递增。第一列只是一个连续的整数列。

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