排名功能总是带回连续的排名

时间:2012-11-20 12:18:59

标签: sql sql-server sql-server-2008 tsql

我有一个简单的表,里面有id。

1
5
22

当我执行以下操作时

select *, rank() over (order by id) as rank from my table

等级回归

1
2
3

我不明白为什么排名是连续的?我期待像

这样的东西
1
4
17

我原本期望dense_rank函数的连续行为。

3 个答案:

答案 0 :(得分:2)

所有ID都不同,这就是这种行为的原因。当您订购的值相等时,排名功能会起作用。

create table TableName(id int);
insert into TableName values(1);
insert into TableName values(5);
insert into TableName values(5);
insert into TableName values(22);
insert into TableName values(22);
insert into TableName values(22);

select *, 
rank() over (order by id) as rank,
dense_rank() over (order by id) as dense_rank,
row_number() over (order by id) as row_num
from TableName

ID  RANK    DENSE_RANK  ROW_NUM
1   1         1         1
5   2         2         2
5   2         2         3
22  4         3         4
22  4         3         5
22  4         3         6

Demo

Ranking Functions (Transact-SQL)

答案 1 :(得分:0)

id是连续的吗?如果没有联系,那么RANK和DENSE_RANK将返回相同的值。

答案 2 :(得分:0)

请改为尝试:

;WITH CTE
AS
(
  SELECT *, 
    RANK() OVER(ORDER BY id) as rank
  FROM tablename
 )
SELECT 
  c1.Id,
  (c1.id - ISNULL(c2.ID, 0)) rank
FROM CTE c1
LEFT JOIN cte c2 ON c1.rank - c2.rank = 1;

SQL Fiddle Demo