2016-01-06 78 views

回答

2
DECLARE @table TABLE(name CHAR(1) , surname CHAR(1) , val TINYINT) 

INSERT INTO @table 
VALUES ('a' , 'b' , 10) 
, ('c' , 'd' , 2) 
, ('a' , 'b' , 11) 
, ('a' , 'b' , 13) 

SELECT * FROM @table 

SELECT * 
, ROW_NUMBER() OVER (PARTITION BY name, surname ORDER BY val) as rowno 
, DENSE_RANK() OVER (ORDER BY name) as partitionid 
FROM @table 

商祺!

+0

在第一個答案中使用用於rowno的dense_rank()和在答案中使用row_number()之間有什麼區別?@chancrovsky – bill

+0

使用DENSE_RANK:如果兩個或更多行在同一分區中爲一個等級綁定,行接收到與ROW_NUMBER相同的Rank,這不會發生。 – chancrovsky

1

dense_rank窗函數似乎符合該法案:

SELECT *, 
     DENSE_RANK() OVER (PARTITION BY name, surname ORDER BY val) AS rowno, 
     DENSE_RANK() OVER (ORDER BY name, surname) AS partitionid 
FROM mytable