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

代わりにこれを試してください:

;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 に答える
0

IDは連続していますか?同順位でない場合、RANK と DENSE_RANK は同じ値を返します。

于 2012-11-20T12:25:34.437 に答える