SQL 计算迄今为止的汇总总数

SQL Calculating Aggregated Totals-To-Date

假设我有一个 table、my_table,有 2 列:datevalue。 我想计算第 3 列:aggregated_value_year_to_date.

目前我正在这样做:

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 实际上是一个中等复杂的视图时,是否有任何选项具有更好的性能?

此查询正在反复重新评估基础视图,这变得相当昂贵。

使用累加和window函数:

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 子句。