假设我有一个表my_table
,有两列:date
,value
。
我想计算第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
实际上是一个中等复杂的视图时,有哪些选项具有更好的性能?
此查询重复重新评估基础视图,这种方法相当昂贵。
答案 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;
这两个假设每个日期(最多)有一行。它使用方便的快捷方式而不是窗口子句。