MySQLのウィンドウ関数は、現在の行に関連する行のセット間で計算を実行するために使用されます。これは、結果を集計関数のように単一の出力行に崩壊させることなく行われます。代わりに、Window関数は、 OVER
句によって定義された行のウィンドウまたはフレームに基づいて、元の結果セットのすべての行の値を返します。
MySQLでウィンドウ関数を使用する方法の基本的な例を次に示します。
<code class="sql">SELECT employee_id, salary, AVG(salary) OVER (PARTITION BY department_id) AS avg_salary_by_dept FROM employees;</code>
この例では、 AVG
関数は各部門内の平均給与を計算します(句PARTITION BY
で定義されています)。 OVER
句は、関数が適用されるウィンドウを指定します。
ウィンドウ関数の主要なコンポーネントは次のとおりです。
ROW_NUMBER()
、 RANK()
、 DENSE_RANK()
、 SUM()
、 AVG()
など)。句:これはウィンドウ関数に必須であり、関数が適用されるウィンドウを定義します。含めることができます:
PARTITION BY
:結果セットをパーティションに分割し、関数が適用されます。ORDER BY
:パーティション内の行の順序を定義します。ROWS
またはRANGE
:現在の行に対する行のフレームを指定します。たとえば、日付ごとに販売の合計を実行するには:
<code class="sql">SELECT date, sales, SUM(sales) OVER (ORDER BY date) AS running_total FROM sales_data;</code>
この場合、 SUM
はウィンドウ関数であり、 OVER (ORDER BY date)
結果の開始から現在の行までのすべての行としてウィンドウを定義し、日付で注文します。
データ分析のためにMySQLでウィンドウ関数を使用すると、いくつかの利点が得られます。
たとえば、各部門内の上位3人の最高額の従業員を見つけるには:
<code class="sql">SELECT department_id, employee_id, salary, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_within_dept FROM employees WHERE rank_within_dept </code>
はい、ウィンドウ関数はMySQLのクエリパフォーマンスを潜在的に改善する可能性があります。方法は次のとおりです。
ただし、パフォーマンスの影響は、特定のユースケースとデータ分布によって異なる場合があることに注意してください。一部のシナリオでは、ウィンドウ関数は、特にデータセットが小さい場合、またはウィンドウ操作が複雑な場合、大きなパフォーマンスブーストを提供しない場合があります。
たとえば、前日の売り上げの違いを計算するためのクエリを検討してください。
<code class="sql">SELECT date, sales, sales - LAG(sales) OVER (ORDER BY date) AS sales_difference FROM sales_data;</code>
このクエリでは、 LAG
関数を使用して販売と前日を比較します。これは、自己結合を使用するよりも効率的です。
ウィンドウ関数は強力ですが、MySQLで実装する際に考慮すべき制限と特定のユースケースがあります。
OVER
句内のフレームを定義するためのROWS
またはRANGE
条項をサポートしていません。ウィンドウ関数が特に役立つ特定のユースケースは次のとおりです。
時系列分析:移動平均の計算、合計の実行、または履歴データとの現在の値の比較。
<code class="sql">SELECT date, sales, AVG(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg_3_days FROM sales_data;</code>
ランキングとパーセンタイルの計算:トップパフォーマーの特定またはグループ内のパーセンタイルランクの計算。
<code class="sql">SELECT employee_id, salary, PERCENT_RANK() OVER (ORDER BY salary) AS percentile_rank FROM employees;</code>
累積集約:時間またはパーティション内で累積合計またはカウントを追跡します。
<code class="sql">SELECT product_id, date, quantity, SUM(quantity) OVER (PARTITION BY product_id ORDER BY date) AS cumulative_quantity FROM inventory;</code>
比較分析:グループの平均または合計との値を比較します。
<code class="sql">SELECT department_id, employee_id, salary, salary - AVG(salary) OVER (PARTITION BY department_id) AS salary_vs_dept_avg FROM employees;</code>
要約すると、MySQLのウィンドウ関数は強力な分析機能を提供しますが、特定のユースケースとデータ特性に従って、それらの制限を理解し、使用を最適化することが重要です。
以上がMySQLでウィンドウ関数をどのように使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。