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)