次のような表があります。
id count
1 100
2 50
3 10
累積的な合計という新しい列を追加したいので、テーブルは次のようになります。
id count cumulative_sum
1 100 100
2 50 150
3 10 160
これを簡単に実行できるMySQL更新ステートメントはありますか?これを達成する最良の方法は何ですか?
パフォーマンスが問題になる場合は、MySQL変数を使用できます。
set @csum := 0;
update YourTable
set cumulative_sum = (@csum := @csum + count)
order by id;
または、cumulative_sum
列を削除して、各クエリで計算することもできます。
set @csum := 0;
select id, count, (@csum := @csum + count) as cumulative_sum
from YourTable
order by id;
これは、実行中の方法で実行中の合計を計算します:)
_ SELECT t.id,
t.count,
(SELECT SUM(x.count)
FROM TABLE x
WHERE x.id <= t.id) AS cumulative_sum
FROM TABLE t
ORDER BY t.id
_
_ SELECT t.id,
t.count,
@running_total := @running_total + t.count AS cumulative_sum
FROM TABLE t
JOIN (SELECT @running_total := 0) r
ORDER BY t.id
_
注意:
JOIN (SELECT @running_total := 0) r
はクロスジョインであり、別のSET
コマンドを必要とせずに変数を宣言できます。r
は、サブクエリ/派生テーブル/インラインビューのMySQLに必要です。警告:
ORDER BY
_は重要です。順序がOPに一致することを保証し、より複雑な変数の使用に大きな影響を与えることができます(つまり、MySQLにはないpsuedo ROW_NUMBER/RANK機能)MySQL 8.0/MariaDBは、ウィンドウ化された SUM(col) OVER()
をサポートしています。
SELECT *, SUM(cnt) OVER(ORDER BY id) AS cumulative_sum
FROM tab;
出力:
┌─────┬──────┬────────────────┐
│ id │ cnt │ cumulative_sum │
├─────┼──────┼────────────────┤
│ 1 │ 100 │ 100 │
│ 2 │ 50 │ 150 │
│ 3 │ 10 │ 160 │
└─────┴──────┴────────────────┘
UPDATE t
SET cumulative_sum = (
SELECT SUM(x.count)
FROM t x
WHERE x.id <= t.id
)
select Id, Count, @total := @total + Count as cumulative_sum
from YourTable, (Select @total := 0) as total ;
サンプルクエリ
SET @runtot:=0;
SELECT
q1.d,
q1.c,
(@runtot := @runtot + q1.c) AS rt
FROM
(SELECT
DAYOFYEAR(date) AS d,
COUNT(*) AS c
FROM orders
WHERE hasPaid > 0
GROUP BY d
ORDER BY d) AS q1
各挿入の前に合計を計算するトリガーを作成することもできます
delimiter |
CREATE TRIGGER calCumluativeSum BEFORE INSERT ON someTable
FOR EACH ROW BEGIN
SET cumulative_sum = (
SELECT SUM(x.count)
FROM someTable x
WHERE x.id <= NEW.id
)
set NEW.cumulative_sum = cumulative_sum;
END;
|
私はこれをテストしていません
select id、count、sum(count)over(order by count desc)as actual_sum as tableName;
Count列でsum集計関数を使用してから、over句を使用しました。各行を個別に合計します。最初の行は100になります。2行目は100 + 50になります。 3行目は100 + 50 + 10などです。したがって、基本的にすべての行はその行と前のすべての行の合計であり、最後の行はすべての行の合計です。したがって、これを見る方法は、各行がIDがそれ以下の金額の合計です。