この記事では、ランキング、集計、および値関数に分類されたSQLウィンドウ関数を調査します。ランニング合計の計算における使用法の詳細と、パフォーマンスの意味とさまざまな結合タイプとの互換性について説明します。メインフォーカス
SQLのウィンドウ関数は、現在の行に関連する一連のテーブル行全体に計算を許可することにより、標準の集計関数の機能を拡張します。彼らは、 GROUP BY
のような小さな結果にグループをグループ化しません。代わりに、彼らはPARTITION BY
によって定義された行の「ウィンドウ」で操作し、句ORDER BY
。主なカテゴリは3つあります。
ORDER BY
に指定された順序に基づいて、パーティション内の各行にランクまたは順序の位置を割り当てます。例には、 RANK()
、 ROW_NUMBER()
、 DENSE_RANK()
、 NTILE()
が含まれます。 RANK()
順序付け列に同じ値がある場合、同じランクを複数行に割り当てることができますが、 ROW_NUMBER()
は、たとえ結ばれていても、すべての行に一意のランクを割り当てます。 DENSE_RANK()
、ギャップなしで連続したランクを割り当て、ネクタイに割り当てられていたランクをスキップします。 NTILE()
行を指定された数のグループに分割します。SUM
、 AVG
、 MIN
、 MAX
、 COUNT
など)を実行します。標準の集約関数との重要な違いは、結果セットの各行の値を返すことであり、各グループの単一の集計値ではありません。たとえば、 SUM() OVER (PARTITION BY department ORDER BY salary)
給与によって命じられた各部門の累積給与額を計算します。LAG()
とLEAD()
は一般的な例であり、それぞれ現在の行の前または成功した行から値を取得します。 FIRST_VALUE()
およびLAST_VALUE()
ウィンドウ内の最初と最後の値を取得します。これらは、行の価値を隣人と比較したり、コンテキスト情報を見つけたりするのに役立ちます。累積合計とも呼ばれる合計の実行は、ウィンドウ関数を使用して簡単に計算されます。コアコンポーネントは、 SUM()
集計ウィンドウ関数と句ORDER BY
と組み合わされています。
列のdate
とamount
を備えたsales
と呼ばれるテーブルがあるとしましょう。毎日の販売の実行合計を計算するには:
<code class="sql">SELECT date, amount, SUM(amount) OVER (ORDER BY date) as running_total FROM sales;</code>
このクエリは、日付ごとに売り上げを注文し、各行のSUM(amount) OVER (ORDER BY date)
、すべての行のamount
の合計を計算し、現在の行を含めます。
特定のカテゴリ(製品カテゴリなど)によってパーティション化されたランニング合計を計算する場合は、句PARTITION BY
追加します。
<code class="sql">SELECT product_category, date, amount, SUM(amount) OVER (PARTITION BY product_category ORDER BY date) as running_total_by_category FROM sales;</code>
これにより、各product_category
に対して別の実行合計が提供されます。
ウィンドウ関数は強力ですが、特に複雑なクエリや大規模なデータセットでクエリパフォーマンスに影響を与える可能性があります。パフォーマンスへの影響は、いくつかの要因に依存します。
PARTITION BY
、特に複数の列または非インデックス列が含まれるORDER BY
は、処理時間を大幅に増加させる可能性があります。パフォーマンスには効率的なインデックス作成が重要です。パフォーマンスの問題を軽減するには:
PARTITION BY
で使用されている列のインデックスと、条項ORDER BY
が不可欠です。PARTITION BY
維持し、 ORDER BY
。はい、ウィンドウ関数はさまざまなタイプの結合で使用できますが、ウィンドウ定義は慎重に考慮する必要があります。ウィンドウは、結合操作後に定義されます。
たとえば、2つのテーブル、 orders
、 customers
customer_id
に参加している場合、ウィンドウ関数を使用して各顧客の合計注文値を計算できます。
<code class="sql">SELECT o.order_id, c.customer_name, o.order_value, SUM(o.order_value) OVER (PARTITION BY c.customer_id) as total_customer_value FROM orders o JOIN customers c ON o.customer_id = c.customer_id;</code>
ここで、ウィンドウSUM(o.order_value) OVER (PARTITION BY c.customer_id)
JOIN
操作が両方のテーブルのデータを組み合わせた後、各顧客の合計値を計算します。句PARTITION BY
、各顧客に対して合計が個別に計算されることを保証します。同じ原則が他の結合タイプにも当てはまります(左結合、右結合、完全な外側結合)。重要なのは、ウィンドウ関数がJoinによって生成された結果セットで動作することです。
以上がSQL(ランキング、集計、値)のウィンドウ関数のさまざまなタイプは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。