在SQL Server中分配行号,但按值分组

Jef*_*ddy 5 sql t-sql sql-server

我想从表中选择2列,并为每个值分配一个int值.但是,我希望第一列ID对于所有相同的值都相同.

对于第二列,我希望每个值都编号,但是按第一列分区.我已经想出了这篇文章,但我无法让第一部分工作.

这是我正在使用的测试场景.

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
Run Code Online (Sandbox Code Playgroud)

当我运行它时,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
Run Code Online (Sandbox Code Playgroud)

And*_*rew 10

你只需要使用不同的排名功能,

dense_rank() OVER (ORDER BY Column1) as Column1_ID
Run Code Online (Sandbox Code Playgroud)

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

SQL小提琴:http://www.sqlfiddle.com/#!6 / d41d8/1832