検索結果をグループ単位で順位を飛ばさずに順位を付けるには、DENSE_RANK~PARTITION BY句を使用します。
順位を飛ばさずとは、同値が存在した場合でも次の順位は連番になるという事です。
サンプル
例)class列単位にscore列の降順で順位を付ける
NAME | CLASS | SCORE |
---|---|---|
Aさん | X | 60 |
Bさん | X | 70 |
Cさん | Y | 80 |
Dさん | Y | 70 |
Eさん | Z | 50 |
Fさん | X | 60 |
Gさん | X | 50 |
1 2 3 4 5 6 7 8 9 10 |
SELECT DENSE_RANK() OVER(PARTITION BY class ORDER BY score desc) AS ranking, name, class, score FROM m_user ORDER BY class, ranking |
検索結果
- SQL*Plus
- RANKING NAME CLASS SCORE -------- --------- ------- -------- 1 Bさん X 70 2 Aさん X 60 2 Fさん X 60 3 Gさん X 50 1 Cさん Y 80 2 Dさん Y 70 1 Eさん Z 50
CLASS列単位に順位が付きます。Aさん、Fさんは同点なので同じ順位です。続くGさんは2位が2名いますが3番になります。
備考
- 同率同順の場合は同じ順位にしたり、同率同順の次の順位は飛び番としたりしたい場合は、下記関連ページをご覧ください。
関連ページ
- [ORACLE関数] 順位を飛ばして順位を付ける(RANK~OVER)
- [ORACLE関数] 順位を飛ばさずに順位を付ける(DENSE_RANK)
- [ORACLE関数] レコードに順番を付ける(ROW_NUMBER~OVER)
- [ORACLE関数] グループ単位で順位を飛ばして順位を付ける(RANK~PARTITION BY)
- [ORACLE関数] グループ単位で順位を飛ばさずに順位を付ける(DENSE_RANK~PARTITION BY)
- [ORACLE関数] グループ単位にレコードに順番を付ける(ROW_NUMBER~PARTITION)