ホームページ >データベース >mysql チュートリアル >MySQL で累積合計を効率的に計算するにはどうすればよいですか?

MySQL で累積合計を効率的に計算するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-05 16:15:40701ブラウズ

How Can I Efficiently Calculate Cumulative Sums in MySQL?

MySQL の行の累積合計

時間ごとにグループ化された各 ID の累積合計を決定するには、一般的なアプローチが使用されます。 MySQLで。 MySQL の以前のバージョンには分析関数が存在しないため、相関サブクエリまたは MySQL ユーザー変数という 2 つの主要な方法が採用されています。

相関サブクエリ アプローチ

この戦略一致基準に基づいて各行の累積合計を計算するサブクエリが含まれます。ただし、大量のデータセットではリソースを大量に消費する可能性があります。

ユーザー変数アプローチ

より効率的な方法には、MySQL ユーザー変数と、ORDER BY 句を使用したラップされたクエリが含まれます。行処理順序を確保するため。次の手順は、このアプローチの概要を示しています。

  1. 既存のセッション値からの干渉を避けるためにユーザー変数を初期化します。
  2. ORDER BY 句を使用して、元のクエリをインライン ビューとして埋め込みます。
  3. SELECT ステートメント内で累積合計計算を実行し、前の行の値と現在の行の値を比較します。
  4. 現在の行の値を割り当てます。行の値を次の反復のユーザー変数に追加します。

このアプローチの例:

SELECT
  IF(@prev_id = c.id AND @prev_day = c.day
    , @cumtotal := @cumtotal + c.amount
    , @cumtotal := c.amount) AS cumulative_total
, @prev_id  := c.id  AS `id`
, @prev_day := c.day AS `day`
, c.hr
, c.amount AS `amount'
FROM
  (
    SELECT
      @prev_id  := NULL
    , @prev_day := NULL
    , @cumtotal := 0
  ) i
JOIN
  (
    SELECT id, day, hr, amount FROM
    (
      // Original query with multiple joins and unions
    ) a
    LEFT JOIN
    (
      // Unions on multiple tables
    ) b
    ON a.id = b.id
    ORDER BY 1, 2, 3
  ) c

このアプローチにより、MySQL バージョン 8.0 より前のバージョンで累積合計を効率的に計算できます。ウィンドウ関数が導入されたとき。

以上がMySQL で累積合計を効率的に計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。