У меня есть таблица, которая похожа на это:
id count
1 100
2 50
3 10
Я хочу добавить новый столбец, названный cumulative_sum, таким образом, таблица была бы похожа на это:
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;
Это вычисляет текущую сумму в бегущий путь :)
UPDATE t
SET cumulative_sum = (
SELECT SUM(x.count)
FROM t x
WHERE x.id <= t.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 для любого подзапроса / производной таблицы / встроенного представления Предостережения:
ЗАКАЗ
важен; он обеспечивает соответствие порядка OP и может иметь более серьезные последствия для более сложного использования переменных (IE: функция psuedo ROW_NUMBER / RANK, которой не хватает MySQL) Вы также можете создать триггер, который будет вычислять сумму перед каждой вставкой
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;
|
Я не тестировал это