ROW_NUMBER、RANK、DENSE_RANK
パーティション内の行に番号と順位を付け、同順位に適したランキング関数を選びます。
「ROW_NUMBER、RANK、DENSE_RANK」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
3つの順位付け関数
パーティション内の行に番号を付ける、3つのウィンドウ関数を見てみましょう。
ROW_NUMBER()— 1、2、3、4(常に一意)RANK()— 1、2、2、4(同順位は同じ順位になり、その後の順位を飛ばす)DENSE_RANK()— 1、2、2、3(同順位は同じ順位になるが、順位を飛ばさない)
ROW_NUMBER
各パーティション内で1、2、3の番号を付けます。同順位の行の順序は任意になるため、決定性を持たせるにはORDER BYにタイブレーカーを指定してください。
SELECT id, user_id, total,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC, id
) AS rn
FROM orders;グループごとの上位N件
ROW_NUMBERの代表的な用途です。
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC
) AS rn
FROM orders
)
SELECT * FROM ranked WHERE rn <= 3;
-- Each user's top 3 orders.RANK
ORDER BYの値が同じ行には同じ順位が付き、次に異なる値の順位はその分だけ飛びます。
-- totals: 100, 90, 90, 70
-- RANK: 1, 2, 2, 4 (skipped 3)
SELECT id, total,
RANK() OVER (ORDER BY total DESC) AS rk
FROM orders;DENSE_RANK
RANKと同じですが、順位を飛ばしません。
-- totals: 100, 90, 90, 70
-- DENSE: 1, 2, 2, 3
SELECT id, total,
DENSE_RANK() OVER (ORDER BY total DESC) AS dr
FROM orders;使い分け
- 一意の番号が必要(ページネーションなど)ですか。
ROW_NUMBER - 従来の「同順位の次の順位を飛ばす」方式で順位付けしますか。
RANK - 「同順位は同じ順位にし、次は連続した順位にする」方式で順位付けしますか。
DENSE_RANK
NTILE:N分位バケット
NTILE(n)は、行をほぼ均等なn個のバケットに分配します。
SELECT id, total,
NTILE(4) OVER (ORDER BY total) AS quartile
FROM orders;
-- 1 = bottom 25%, 4 = top 25%重複行の削除
ROW_NUMBERとDELETEを使うと、重複グループごとに1行を残せます。
WITH dups AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users WHERE id IN (SELECT id FROM dups WHERE rn > 1);グループごとのページネーション
「各ユーザーの注文を1ページ5件ずつ表示する」場合の2ページ目です。
WITH r AS (
SELECT id, user_id,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM orders
)
SELECT * FROM r WHERE rn BETWEEN 6 AND 10;PERCENT_RANKとCUME_DIST
パーティション内での相対的な位置を表します。
SELECT id, total,
PERCENT_RANK() OVER (ORDER BY total) AS pct_rank,
CUME_DIST() OVER (ORDER BY total) AS cume_dist
FROM orders;パフォーマンス
順位付け関数では、各パーティション内で入力をソートする必要があります。(partition_col, order_col)に対するインデックスによって、ソート処理を回避できる場合があります。
まとめ
3つの順位付け関数で、ほとんどの用途に対応できます。
- 一意性にはROW_NUMBER
- 同順位を含む順位付けにはRANK / DENSE_RANK
- 分位バケットにはNTILE
理解度チェック
合計が100、90、90、70の場合、DENSE_RANKはどの結果を返しますか。
AI チューターと学ぶ SQL — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 46
- レッスン
- 183
よくある質問
「ROW_NUMBER、RANK、DENSE_RANK」レッスンは無料ですか?
はい。「ROW_NUMBER、RANK、DENSE_RANK」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「ROW_NUMBER、RANK、DENSE_RANK」で何を学びますか?
パーティション内の行に番号と順位を付け、同順位に適したランキング関数を選びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ROW_NUMBER、RANK、DENSE_RANK」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- OVER、PARTITION BY、ORDER BY
- ROW_NUMBER、RANK、DENSE_RANK
- LAG、LEADと時系列パターン
- 累積合計と移動平均