次のようなテーブルがあります。
id count
1 100
2 50
3 10
累積_合計という新しい列を追加したいので、テーブルは次のようになります。
id count cumulative_sum
1 100 100
2 50 150
3 10 160
これを簡単に実行できる MySQL 更新ステートメントはありますか? これを達成するための最良の方法は何ですか?
次のようなテーブルがあります。
id count
1 100
2 50
3 10
累積_合計という新しい列を追加したいので、テーブルは次のようになります。
id count cumulative_sum
1 100 100
2 50 150
3 10 160
これを簡単に実行できる MySQL 更新ステートメントはありますか? これを達成するための最良の方法は何ですか?
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
が必要です。警告:
ORDER BY
重要です。順序がOPと一致することを保証し、より複雑な変数の使用法に大きな影響を与える可能性があります(IE:MySQLにない疑似ROW_NUMBER / RANK機能)パフォーマンスが問題になる場合は、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;
これは実行中の方法で実行中の合計を計算します:)
MySQL 8.0/MariaDB は windowed をサポートしています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
)
サンプルクエリ
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;
|
私はこれをテストしていません
id,count,sum(count)over(count desc による順序) を tableName からのcumulative_sum として選択します。
count 列で sum 集計関数を使用してから、over 句を使用しました。各行を個別に合計します。最初の行は 100 になります。2 番目の行は 100+50 になります。3 行目は 100+50+10 などです。したがって、基本的にすべての行はそれと前のすべての行の合計であり、最後の行はすべての行の合計です。したがって、これを見る方法は、各行は、ID がそれ自体以下の金額の合計です。