嗨我想根据滚动总和(valy)的前一行值和valx的当前行值
进行滚动总和(valx)valy = previousrow_valy + valx
animal valx valy
cat 1 1
cat 3 4
cat 2 6
dog 4 4
dog 6 10
dog 7 17
dog 8 25
答案 0 :(得分:1)
您应该在这里定义一个订单。
假设您想按somecolumn
订购。
在Oracle
和PostgreSQL 8.4
:
SELECT animal, valx, SUM(valx) OVER (PARTITION BY animal ORDER BY somecolumn) AS valy
FROM mytable
在MySQL
:
SELECT animal, valx,
@valy := CASE WHEN @animal = animal THEN @valy + valx ELSE valx END AS valy,
@animal := animal
FROM (
SELECT @valy = 0,
@animal := NULL
) vars,
mytable
ORDER BY
animal, somecolumn
在SQL Server
中,这是创建CURSOR
效率更高的极少数情况之一。
所有数据库(包括SQL Server
)都支持ANSI
语法:
SELECT animal, valx,
(
SELECT SUM(valx)
FROM mytable mi
WHERE mi.animal = mo.animal
AND mi.somecolumn <= mo.somecolumn
) AS valy
FROM mytable mo
然而,如果mytable
中有很多记录,执行时间会增加为O(n^2)