1

我有一个简单的表,其中包含 id。

1
5
22

当我执行以下操作时

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

排名回来为

1
2
3

我不明白为什么排名是连续的?我期待类似的东西

1
4
17

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

4

3 回答 3

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

排名函数 (Transact-SQL)

于 2012-11-20T12:30:24.930 回答
0

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

于 2012-11-20T12:25:34.437 回答
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 小提琴演示

于 2012-11-20T12:28:47.330 回答