Buat lajur untuk jumlah kumulatif dalam MySQL
P粉670838735
P粉670838735 2023-08-22 11:26:08
0
2
496
<p>Saya mempunyai jadual yang kelihatan seperti ini:</p> <pre class="brush:php;toolbar:false;">kiraan id 1 100 2 50 3 10</pra> <p>Saya mahu menambah lajur baharu yang dipanggil kumulatif_sum, jadi jadual kelihatan seperti ini: </p> <pre class="brush:php;toolbar:false;">id count cumulative_sum 1 100 100 2 50 150 3 10 160</pra> <p>Adakah terdapat pernyataan kemas kini MySQL yang boleh mencapai ini dengan mudah? Apakah pendekatan terbaik? </p>
P粉670838735
P粉670838735

membalas semua(2)
P粉245276769

Gunakan pertanyaan berkaitan:


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

Gunakan pembolehubah MySQL:


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

Nota:

  • JOIN (SELECT @running_total := 0) r是一个交叉连接,允许在不需要单独的SETIsytiharkan pembolehubah dalam konteks arahan.
  • MySQL memerlukan alias jadual untuk sebarang subkueri/jadual terbitan/paparan sebarisr

Nota:

  • Hanya berfungsi dengan MySQL, tidak mudah alih ke pangkalan data lain
  • ORDER BYSangat penting, ia memastikan pesanan sepadan dengan soalan asal, dan mungkin mempunyai kesan yang lebih besar untuk penggunaan pembolehubah yang lebih kompleks (cth: fungsi ROW_NUMBER/RANK semu, tidak disokong oleh MySQL)
P粉006540600

Jika prestasi adalah isu, anda boleh menggunakan pembolehubah MySQL:

set @csum := 0;
update YourTable
set cumulative_sum = (@csum := @csum + count)
order by id;

Sebagai alternatif, anda boleh mengalih keluar lajur cumulative_sum dan mengiranya dalam setiap pertanyaan:

set @csum := 0;
select id, count, (@csum := @csum + count) as cumulative_sum
from YourTable
order by id;

Ini mengira jumlah kumulatif secara berterusan :)

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan