メインコンテンツにスキップ
モジュール 7 · レッスン 2 / 4コース内の 26/57~14 min
モジュールのレッスン (2/4)

ウィンドウ関数: ランキングとグループごとの計算

ウィンドウ関数 は、「行のグループ」を操作する関数です。 (window) ただし、GROUP BY とは異なり、** の数は減りません。 rows**: ウィンドウ上で計算された値が、 最終結果。

ランキング、累進的な番号付け、パーセンテージに最適なツールです グループ合計に対する操作や、その他多くの厄介な操作や GROUP BY では不可能です。

構文: function() OVER (…)

SQL
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)

コンポーネント:

  • PARTITION BY — 「グループ」 (GROUP BY など) を定義しますが、行 別居してください)。
  • OVER(…) 内の ORDER BY — 内の順序を定義します パーティション。

OVER () (空の括弧) は、「テーブル全体を 1 つのウィンドウとして表示する」ことを意味します。 「合計に対する割合」などの計算に便利です。

ランキング機能

SQL
ROW_NUMBER() OVER (PARTITION BY p ORDER BY o)
RANK()       OVER (PARTITION BY p ORDER BY o)
DENSE_RANK() OVER (PARTITION BY p ORDER BY o)

相違点 (値 100, 100, 90, 80 の場合):

機能ポジション
ROW_NUMBER1、2、3、4 (常に一意)
RANK1、1、3、4 (同点は位置を共有し、「ギャップ」が残ります)
DENSE_RANK1、1、2、3 (タイは同じ位置を共有し、ギャップなし)

例: カテゴリごとの製品ランキング

SQL
SELECT name,
       category_id,
       price,
       RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS rank
FROM   products
ORDER BY category_id, rank;

各 category_id に対して、RANK は 1 から再開され、降順で順序付けされます。 価格: 各カテゴリ内の製品のランキングを 1 つで取得できます。 撃った。

プログレッシブ番号付け

SQL
-- Progressive order number for each customer:
SELECT id,
       customer_id,
       ordered_at,
       ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY ordered_at) AS row_num
FROM   orders
ORDER BY customer_id, row_num;

各顧客の最初の注文には row_num = 1、2 番目の注文には 2 というようになります。

試してみてください

運動#sql.m7.l2.e1
試行回数: 0読み込み中…

各製品について、名前、カテゴリ ID、価格、およびランク (カテゴリ内の価格の降順によるランキング。RANK を使用) を表示します。 category_id とランクの昇順で並べます。

エディターを読み込み中…
ヒントを表示

PARTITION BY category_id グループ、ORDER BY 価格 DESC グループ内の注文。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m7.l2.e2
試行回数: 0読み込み中…

注文ごとに、id、customer_id、ordered_at、row_num (顧客あたりの漸進的な ROW_NUMBER、ordered_at の昇順で並べられます) を表示します。 customer_id と row_num で並べ替えます。

エディターを読み込み中…
ヒントを表示

ROW_NUMBER はパーティション内で常に一意です。

3 回の試行後に解決策が利用可能になります