こんにちはローリングサム(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
ここで順序を定義する必要があります。
で注文したいとします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
な稀なケースの 1 つです。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)