Menu
Coddy logo textTech

RANK & DENSE_RANK Functions

CoddyのSQLジャーニー「基礎」セクションの一部 — レッスン 65/72。

ROW_NUMBER() はランキング関数の一種で、他に RANK()DENSE_RANK() の2つがあります。

RANK() 関数は ROW_NUMBER() のように行を番号付けしますが、同じ行には同じ番号を割り当て、番号をスキップします。 DENSE_RANK()RANK() に似ていますが、番号をスキップしません。

例:

idlevel
15
26
36
47
57
65
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

これは以下を返します:

idrow_numrow_rankrow_dense_rank
1111
6211
2332
3432
4553
5653

説明:

  • ROW_NUMBER(): 常に一意: 1, 2, 3, 4, 5, 6
  • RANK():
    • level 5 (2 rows): both get rank 1
    • level 6 (2 rows): both get rank 3 (skips 2)
    • level 7 (2 rows): both get rank 5 (skips 4)
  • DENSE_RANK():
    • level 5 (2 rows): both get rank 1
    • level 6 (2 rows): both get rank 2 (no skip)
    • level 7 (2 rows): both get rank 3 (no skip)
challenge icon

チャレンジ

簡単

利用可能なテーブルと列:

  • <strong>medals</strong>: <strong>region</strong>, <strong>medal_color</strong>, <strong>medal_count</strong>

地域、総メダル数(色の関係なくすべてのメダルの合計)、および2種類のランキングを表示するクエリを作成してください:

  1. 合計メダルに対する regular_rank(ギャップあり)
  2. メダルの合計に対する dense_rank(ギャップなし)

結果を次のように並べ替え:

order by total_medals desc, region asc

チートシート

SQL は、タイ値に対して異なる動作をする3つのランキング関数を提供します:

  • ROW_NUMBER() - 一意の連続番号を割り当てます
  • RANK() - タイ値に同じランクを割り当て、後続のランクをスキップします
  • DENSE_RANK() - タイ値に同じランクを割り当て、ランクをスキップしません

例:

idlevel
15
26
36
47
57
65
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

これは以下を返します:

idrow_numrow_rankrow_dense_rank
1111
6211
2332
3432
4553
5653

自分で試してみよう

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン