2013-01-03 15 views
5

テーブルから2列を選択し、各値にint値を割り当てたいと思う。しかし、私は最初の列IDが同じであるすべての値で同じであることを望みます。SQL Serverで行番号を割り当てるが、値にグループ化する

第2列では、各値にも番号が付けられますが、最初の列で区切られます。私はこの作品を見つけ出しましたが、最初の部分を働かせることはできません。

私が使用しているテストシナリオは次のとおりです。

DECLARE @TestTable as Table (Column1 char(1), Column2 char(1)) 

INSERT INTO @TestTable SELECT 'A','A' 
INSERT INTO @TestTable SELECT 'A','B' 
INSERT INTO @TestTable SELECT 'A','C' 
INSERT INTO @TestTable SELECT 'B','D' 
INSERT INTO @TestTable SELECT 'B','E' 
INSERT INTO @TestTable SELECT 'B','F' 
INSERT INTO @TestTable SELECT 'B','G' 
INSERT INTO @TestTable SELECT 'B','H' 
INSERT INTO @TestTable SELECT 'C','A' 
INSERT INTO @TestTable SELECT 'C','B' 
INSERT INTO @TestTable SELECT 'C','C' 


SELECT 
    Row_Number() OVER (Partition BY Column1 ORDER BY Column1) as Column1_ID, 
    Column1, 
    Row_Number() OVER (Partition BY Column1 ORDER BY Column1, Column2) as Column2_ID, 
    Column2 
FROM @TestTable 

私はこれを実行すると、Column2_IDの値が正しいですが、以下のように、私はColumn1_IDの値はようにしたいと思います。

Column1_ID Column1 Column2_ID Column2 
1    A  1   A 
1    A  2   B 
1    A  3   C 
2    B  1   D 
2    B  2   E 
2    B  3   F 
2    B  4   G 
2    B  5   H 
3    C  1   A 
3    C  2   B 
3    C  3   C 

答えて

10
あなただけの別のランキング関数を使用する必要が

dense_rank() OVER (ORDER BY Column1) as Column1_ID 

http://msdn.microsoft.com/en-us/library/ms173825.aspx

SQLフィドル:http://www.sqlfiddle.com/#!6/d41d8/1832

+0

1あなたは 'partition'をしたくない場合を除き、それ以外の場合は彼らはすべて値 '1'で出てくる:http://www.sqlfiddle.com/#!6/d41d8/1829 – mellamokb

+0

うん、ちょうど私がそれを削除する必要があることを知った:http://www.sqlfiddle.com/#! 6/d41d8/1832 – Andrew

+0

私はそのソリューションを(あなたが最初に投稿したように)試みたが、うまくいかなかった。私はパーティションがオプションであることを認識しませんでした。ありがとう。これはまさに私が必要とするものです。 –

関連する問題