RANK & DENSE_RANK関数
CoddyのSQLジャーニー「基礎」セクションの一部。レッスン 65/72。
ROW_NUMBER()はランキング関数の一種で、ほかにRANK()とDENSE_RANK()の2つがあります。
RANK()関数はROW_NUMBER()のように行に番号を付けますが、同じ行には同じ番号を付け、番号を飛ばします。DENSE_RANK()はRANK()に似ていますが、番号を飛ばしません。
例:
| id | level |
| 1 | 5 |
| 2 | 6 |
| 3 | 6 |
| 4 | 7 |
| 5 | 7 |
| 6 | 5 |
SELECT id,
ROW_NUMBER() OVER (ORDER BY level) as row_num,
RANK() OVER (ORDER BY level) as row_rank,
DENSE_RANK() OVER (ORDER BY level) as row_dense_rank
FROM table1次の結果が返されます:
| id | row_num | row_rank | row_dense_rank |
| 1 | 1 | 1 | 1 |
| 6 | 2 | 1 | 1 |
| 2 | 3 | 3 | 2 |
| 3 | 4 | 3 | 2 |
| 4 | 5 | 5 | 3 |
| 5 | 6 | 5 | 3 |
説明:
ROW_NUMBER():常に一意:1、2、3、4、5、6RANK():- レベル 5(2 行):どちらもランク 1 を取得
- レベル 6(2 行):どちらもランク 3 を取得(2 をスキップ)
- レベル 7(2 行):どちらもランク 5 を取得(4 をスキップ)
DENSE_RANK():- レベル 5(2 行):どちらもランク 1 を取得
- レベル 6(2 行):どちらもランク 2 を取得(スキップなし)
- レベル 7(2 行):どちらもランク 3 を取得(スキップなし)
チャレンジ
簡単利用可能なテーブルとカラム:
medals:region、medal_color、medal_count
地域、メダルの合計数(色に関係なくすべてのメダルの合計)、および2種類の順位を表示するクエリを作成してください:
regular_rank(順位の間に欠番あり)をメダルの合計に基づいて取得するdense_rank(順位の間に欠番なし)をメダルの合計に基づいて取得する
結果を次の順序で並べ替えてください:
order by total_medals desc, region asc自分で試してみよう
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: SQLプレイグラウンド