Ich habe einen Tisch, der so aussieht:
id count
1 100
2 50
3 10
Ich möchte eine neue Spalte mit dem Namen cumulative_sum hinzufügen, damit die Tabelle folgendermaßen aussieht:
id count cumulative_sum
1 100 100
2 50 150
3 10 160
Gibt es eine MySQL-Update-Anweisung, die dies problemlos ermöglicht? Was ist der beste Weg, um dies zu erreichen?
mysql
sql
running-total
Kirk Ouimet
quelle
quelle
SET
.Name
oder ähnlich, und dann eine kumulative Summe nur für Datensätze mit dem gleichen Namen machenVerwenden einer korrelierten Abfrage:
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
Verwenden von MySQL-Variablen:
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
Hinweis:
JOIN (SELECT @running_total := 0) r
ist ein Cross-Join und ermöglicht die Deklaration von Variablen, ohne dass ein separaterSET
Befehl erforderlich ist .r
wird von MySQL für jede Unterabfrage / abgeleitete Tabelle / Inline-Ansicht benötigtVorsichtsmaßnahmen:
ORDER BY
ist wichtig; Es stellt sicher, dass die Reihenfolge mit dem OP übereinstimmt und größere Auswirkungen auf die kompliziertere Verwendung von Variablen haben kann (IE: psuedo ROW_NUMBER / RANK-Funktionalität, die MySQL fehlt).quelle
SELECT
imJOIN (SELECT @running_total := 0)
Teil des Variablenbeispiels ein verwenden.MySQL 8.0 / MariaDB unterstützt Fenster
SUM(col) OVER()
:SELECT *, SUM(cnt) OVER(ORDER BY id) AS cumulative_sum FROM tab;
Ausgabe:
db <> Geige
quelle
UPDATE t SET cumulative_sum = ( SELECT SUM(x.count) FROM t x WHERE x.id <= t.id )
quelle
select Id, Count, @total := @total + Count as cumulative_sum from YourTable, (Select @total := 0) as total ;
quelle
Beispielabfrage
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
quelle
Sie können auch einen Trigger erstellen, der die Summe vor jeder Einfügung berechnet
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; |
Ich habe das nicht getestet
quelle
Wählen Sie id, count, sum (count) over (Reihenfolge nach Anzahl absteigend) als kumulative_summe aus tableName aus.
Ich habe die Summenaggregatfunktion für die Zählspalte verwendet und dann die over-Klausel verwendet. Es fasst jede der Zeilen einzeln zusammen. Die erste Reihe wird nur 100 sein. Die zweite Reihe wird 100 + 50 sein. Die dritte Reihe ist 100 + 50 + 10 und so weiter. Im Grunde genommen ist jede Zeile die Summe aller und aller vorherigen Zeilen und die allerletzte ist die Summe aller Zeilen. Die Art und Weise, dies zu betrachten, ist, dass jede Zeile die Summe des Betrags ist, bei dem die ID kleiner oder gleich sich selbst ist.
quelle
SELECT ...., (SELECT .... FROM table2 WHERE table2.id = table1.id ) FROM table1
was Sie haben, ist eine Fensterabfrage.select t1.id, t1.count, SUM(t2.count) cumulative_sum from table t1 join table t2 on t1.id >= t2.id group by t1.id, t1.count
Schritt für Schritt:
1- Angesichts der folgenden Tabelle:
select * from table t1 order by t1.id; id | count 1 | 11 2 | 12 3 | 13
2 - Informationen nach Gruppen abrufen
select * from table t1 join table t2 on t1.id >= t2.id order by t1.id, t2.id; id | count | id | count 1 | 11 | 1 | 11 2 | 12 | 1 | 11 2 | 12 | 2 | 12 3 | 13 | 1 | 11 3 | 13 | 2 | 12 3 | 13 | 3 | 13
3- Schritt 3: Summieren Sie alle Zählungen nach t1.id-Gruppe
select t1.id, t1.count, SUM(t2.count) cumulative_sum from table t1 join table t2 on t1.id >= t2.id group by t1.id, t1.count; id | count | cumulative_sum 1 | 11 | 11 2 | 12 | 23 3 | 13 | 36
quelle