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
代わりにこれを試してください:
;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;
IDは連続していますか?同順位でない場合、RANK と DENSE_RANK は同じ値を返します。