SQL计算聚合总计 - 迄今

时间:2017-03-20 10:50:59

标签: sql-server performance views aggregate

假设我有一个表my_table,有两列: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实际上是一个中等复杂的视图时,有哪些选项具有更好的性能?

此查询重复重新评估基础视图,这种方法相当昂贵。

1 个答案:

答案 0 :(得分: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;

这两个假设每个日期(最多)有一行。它使用方便的快捷方式而不是窗口子句。