SQL 计算迄今为止的汇总总数
SQL Calculating Aggregated Totals-To-Date
假设我有一个 table、my_table
,有 2 列: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
实际上是一个中等复杂的视图时,是否有任何选项具有更好的性能?
此查询正在反复重新评估基础视图,这变得相当昂贵。
使用累加和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 子句。
假设我有一个 table、my_table
,有 2 列: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
实际上是一个中等复杂的视图时,是否有任何选项具有更好的性能?
此查询正在反复重新评估基础视图,这变得相当昂贵。
使用累加和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 子句。