SQL Academy · レッスン

ROW_NUMBER、RANK、DENSE_RANK

パーティション内の行に番号と順位を付け、同順位に適したランキング関数を選びます。

レッスン 2/413 ステップ

「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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. OVER、PARTITION BY、ORDER BY
  2. ROW_NUMBER、RANK、DENSE_RANK
  3. LAG、LEADと時系列パターン
  4. 累積合計と移動平均
← SQL Academyに戻る