2

こんにちはローリングサム(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 
4

1 に答える 1

1

ここで順序を定義する必要があります。

で注文したいとしますsomecolumn

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

于 2009-09-18T14:34:14.043 に答える