0

我有三个我想处理的场景,我正在做一些重新映射。

场景 #1 我有表 A

A 列、B 列
1、NULL
2、NULL
3、NULL
4、NULL
5、NULL
6、NULL

如何更新 B 列,以便从 A 列的下一个值开始

A 列、B 列
1、7
2、8
3、9
4、10
5、11
6、12

场景 #2 我有表 A

A 列、B 列
1、NULL
1、NULL
2、NULL
2、NULL
3、NULL
3、NULL
3、NULL

如何更新 B 列,以便我从 A 列的下一个值开始,但确保我只像这样将值更新为一个组

A 列、B 列
1、4
1、4
2、5
2、5
3、6
3、6
3、6

场景 #3 我的表 A 包含 A 列中的空白

A 列、B 列
1、NULL
1、NULL
4、NULL
4、NULL
6、NULL
6、NULL
6、NULL

如何更新 B 列,以便我从 A 列的下一个值开始,但确保我只像这样将值更新为一个组

A 列、B 列
1、7
1、7
4、8
4、8
6、9
6、9
6、9

我可以在一个语句中处理所有这三种情况吗?如果是这样,怎么做?任何帮助深表感谢!

4

3 回答 3

0

这对我来说听起来像是家庭作业,所以我会给你一些观察。

  1. 在所有情况下,您都希望从 max(columnA)+1 开始枚举
  2. select *, dense_rank() over (order by columnA)所有情况下的结果是什么?
于 2012-11-05T03:17:48.543 回答
0

为您提供所需输出的查询

    select A, maxA + row_number() over (order by A) B
      from test
cross join (select max(a) maxA from test) M;

    select A, maxA + dense_rank() over (order by A) B
      from test
cross join (select max(a) maxA from test) M;

参考:

  1. DENSE_RANK() - 返回一个没有差距的排名,允许在同一排名上重复
  2. ROW_NUMBER() - 返回一个没有差距的排名,任意平局相等的值

要将 SELECT 转换为 UPDATE,第一个看起来像这样

;with tmp as (
    select A, maxA + row_number() over (order by A) newB, B
      from test
cross join (select max(a) maxA from test) M
)
update tmp set B = newB;
于 2012-11-05T03:32:01.713 回答
0

试试这个:

UPDATE t1
SET t1.ColumnB = t2.ColumnB
FROM @TableA t1
INNER JOIN 
(
   SELECT 
     ColumnA, 
     ColumnB = DENSE_RANK() OVER(ORDER BY ColumnA) 
               + 
               (SELECT MAX(columnA) FROM @tableA) 
   FROM @tableA
) t2 ON t1.ColumnA = t2.ColumnA;

以下是三种场景的演示:

于 2012-11-05T03:33:28.980 回答