Как сделать итеративный накопительный пакет в SQL - PullRequest
2 голосов
/ 18 сентября 2009

Привет. Я хочу сделать скользящую сумму (из valx) на основе предыдущего значения строки скользящей суммы (valy) и текущего значения строки из 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 

1 Ответ

1 голос
/ 18 сентября 2009

Вы должны определить заказ здесь.

Если вы хотите заказать по somecolumn.

В Oracle и PostgreSQL 8.4:

SELECT  animal, valx, SUM(valx) OVER (PARTITION BY animal ORDER BY somecolumn) AS valy
FROM    mytable

In 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...