0

処理したい 3 つのシナリオがあり、いくつかの再マッピングを行っています。

シナリオ #1 テーブル A があります

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

列 A の次の値から開始するように列 B を更新するにはどうすればよいですか

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

列 A の次の値から開始するように列 B を更新するにはどうすればよいですか?

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

列 A の次の値から開始するように列 B を更新するにはどうすればよいですか?

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

これら 3 つのシナリオすべてを 1 つのステートメントで処理できますか? もしそうなら、どのように?どんな助けでも大歓迎です!

4

3 に答える 3

0

これは宿題のように聞こえるので、いくつかの観察事項を示します。

  1. すべてのケースで、列挙を max(columnA)+1 で開始したいと考えています
  2. select *, dense_rank() over (order by columnA)すべての場合の be の結果はどうなるでしょうか?
于 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;

3 つのシナリオのデモは次のとおりです。

于 2012-11-05T03:33:28.980 に答える