优化Vertica SQL查询以执行运行总计

use*_*681 8 sql running-total vertica window-functions

我有一个带有时间序列数据的表S,如下所示:

key   day   delta
Run Code Online (Sandbox Code Playgroud)

对于给定的密钥,它可能但不太可能缺少天数.

我想从delta值(正INT)构造一个累积列,以便将此累积数据插入另一个表中.这是我到目前为止所得到的:

SELECT key, day,
   SUM(delta) OVER (PARTITION BY key ORDER BY day asc RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
   delta
FROM S
Run Code Online (Sandbox Code Playgroud)

在我的SQL风格中,默认窗口子句是在UNBOUNDED PRECEDING和CURRENT ROW之间的范围,但我把它留在那里是明确的.

这个查询非常慢,比旧的破解查询慢了几个数量级,这个查询为累计计数填充了0.有关生成累积数字的其他方法的建议吗?

我确实在这里查看解决方案: 按表中的分组记录运行总计

我正在使用的RDBM是Vertica.Vertica SQL排除了那里的第一个subselect解决方案,它的查询规划器预测第二个左外连接解决方​​案的成本比我上面显示的分析形式高出约100倍.

Rus*_*Fox -1

有时,仅使用相关子查询会更快:

SELECT 
    [key]
    , [day]
    , delta
    , (SELECT SUM(delta) FROM S WHERE [key] < t1.[key]) AS DeltaSum
FROM S t1
Run Code Online (Sandbox Code Playgroud)