MySQL での行セットの累積合計の計算
セット全体の特定の列の実行中の集計を取得するというタスクに直面しています。 MySQL の行数。課題は、バージョン 8.0 より前の MySQL には組み込みの分析関数が欠如していることです。
ユーザー変数を使用したアプローチ
この状況では、ユーザー変数を使用できます。分析関数の機能をエミュレートします。これには、元のクエリを別のクエリでラップし、ORDER BY を利用して行を順次処理することが含まれます。
外側のクエリは、現在の行の id と day の値が前の行の値と一致するかどうかを確認します。その場合、現在の行の金額を追加することによって累計が更新されます。そうでない場合、累積合計はリセットされ、現在の行の金額に設定されます。
クエリの例
このアプローチを示すクエリの例を次に示します。
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 , @subtotal := 0 ) i JOIN ( select id, day, hr, amount from ( //multiple joins on multiple tables)a left join (//unions on multiple tables)b on a.id=b.id ORDER BY 1,2,3 ) c
このクエリ全体を括弧で囲み、インライン ビューとして使用すると、次のように列を並べ替えることができます。望ましい:
SELECT d.id , d.day , d.hr , d.amount , d.cumulative_total FROM ( // query from above ) d
制限事項
このアプローチは、大規模なデータセットの場合、計算負荷が高くなる可能性があることに留意してください。さらに、元のクエリの述語が複雑な場合、ソリューションの複雑さがさらに増す可能性があります。
以上が8.0 より前の MySQL バージョンで累計を計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。