我有一个简单的表,其中包含 id。
1
5
22
当我执行以下操作时
select *, rank() over (order by id) as rank from my table
排名回来为
1
2
3
我不明白为什么排名是连续的?我期待类似的东西
1
4
17
我本来期望dense_rank
函数的连续行为。
我有一个简单的表,其中包含 id。
1
5
22
当我执行以下操作时
select *, rank() over (order by id) as rank from my table
排名回来为
1
2
3
我不明白为什么排名是连续的?我期待类似的东西
1
4
17
我本来期望dense_rank
函数的连续行为。
所有 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
id是连续的吗?如果没有平局,那么 RANK 和 DENSE_RANK 将返回相同的值。
试试这个:
;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;