2017-03-20 28 views
1

テーブルがmy_tableで、2列がdate,valueであるとします。 3列目:aggregated_value_year_to_dateを計算します。SQL集計合計集計

は現在、私はこれをやっている:

SELECT date, 
     value, 
     (SELECT SUM(value) 
      FROM my_table AS Match 
      WHERE Match.Year = Base.Year 
       AND Match.date < Base.date) AS aggregated_value_year_to_date 

    FROM table AS Base 

は、任意のより良い選択肢はありますか? 特に、my_tableが実際に適度に複雑なビューであるときに、より良いパフォーマンスを持つオプションはありますか?

このクエリは、かなり高価になっている基になるビューを繰り返し評価しています。

答えて

2

は、累積和の窓関数を使用:

SELECT date, value, 
     (sum(value) over (partition by year order by date) - 
     value 
     ) as aggregated_value_year_to_date 
FROM table t; 

over句は、デフォルトで現在の行を含みます。このバージョンは、現在の行の値を減算して、前の値までの合計を取得します。

-に代わるものである:

SELECT date, value, 
     (sum(value) over (partition by year 
           order by date 
           row between unbounded preceding and 1 preceding) 
     ) as aggregated_value_year_to_date 
FROM table t; 

これらの両方日あたり(最大で)一つの行が存在すると仮定する。これは、windowing節の代わりに便利なショートカットを使用します。

+0

私が集計した次のことは、今日の価値をそれに追加することです(つまり、開始と終了の合計を持つ行を '-'にしても問題ありません)。 – Brondahl

+0

btw、typo' FROMテーブルtは 'FROM t'(または私の例では' FROM my_table')でなければなりません – Brondahl

+0

Jeez ....これは〜3500msから<20ms !!! – Brondahl