Вы должны определить заказ здесь.
Если вы хотите заказать по 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)