モジュールのレッスン (2/4)
ウィンドウ関数: ランキングとグループごとの計算
ウィンドウ関数 は、「行のグループ」を操作する関数です。
(window) ただし、GROUP BY とは異なり、** の数は減りません。
rows**: ウィンドウ上で計算された値が、
最終結果。
ランキング、累進的な番号付け、パーセンテージに最適なツールです
グループ合計に対する操作や、その他多くの厄介な操作や
GROUP BY では不可能です。
構文: function() OVER (…)
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)コンポーネント:
PARTITION BY— 「グループ」 (GROUP BYなど) を定義しますが、行 別居してください)。OVER(…)内のORDER BY— 内の順序を定義します パーティション。
OVER () (空の括弧) は、「テーブル全体を 1 つのウィンドウとして表示する」ことを意味します。
「合計に対する割合」などの計算に便利です。
ランキング機能
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_NUMBER | 1、2、3、4 (常に一意) |
RANK | 1、1、3、4 (同点は位置を共有し、「ギャップ」が残ります) |
DENSE_RANK | 1、1、2、3 (タイは同じ位置を共有し、ギャップなし) |
例: カテゴリごとの製品ランキング
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 つで取得できます。
撃った。
プログレッシブ番号付け
-- 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 というようになります。
試してみてください
各製品について、名前、カテゴリ ID、価格、およびランク (カテゴリ内の価格の降順によるランキング。RANK を使用) を表示します。 category_id とランクの昇順で並べます。
ヒントを表示
PARTITION BY category_id グループ、ORDER BY 価格 DESC グループ内の注文。
3 回の試行後に解決策が利用可能になります
復習演習
注文ごとに、id、customer_id、ordered_at、row_num (顧客あたりの漸進的な ROW_NUMBER、ordered_at の昇順で並べられます) を表示します。 customer_id と row_num で並べ替えます。
ヒントを表示
ROW_NUMBER はパーティション内で常に一意です。
3 回の試行後に解決策が利用可能になります