我有一张表S,其时间序列数据如下:
key day delta
对于给定的密钥,可能但不太可能缺少天数。
我想从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
在我的SQL风格中,默认窗口子句是在UNBOUNDED PRECEDING和CURRENT ROW之间的范围,但我把它留在那里是明确的。
这个查询非常慢,比旧的破解查询慢了几个数量级,它为累计计数填充了0。有关生成累积数字的其他方法的建议吗?
我确实看过这里的解决方案: Running total by grouped records in table
我使用的RDBM是Vertica。 Vertica SQL排除了那里的第一个subselect解决方案,它的查询规划器预测第二个左外连接解决方案的成本比我上面显示的分析形式高出约100倍。
答案 0 :(得分:1)
我认为您基本上就在那。您可能只需要稍微更新一下语法:
SELECT s_qty,
Sum(s_price)
OVER(
partition BY NULL
ORDER BY s_qty ASC rows UNBOUNDED PRECEDING ) "Cumulative Sum"
FROM sample_sales;
输出:
S_QTY | Cumulative Sum
------+----------------
1 | 1000
100 | 11000
150 | 26000
200 | 28000
250 | 53000
300 | 83000
2000 | 103000
(7 rows)
参考链接:
https://dwgeek.com/vertica-cumulative-sum-average-and-example.html/
答案 1 :(得分:-1)
有时使用相关子查询会更快:
SELECT
[key]
, [day]
, delta
, (SELECT SUM(delta) FROM S WHERE [key] < t1.[key]) AS DeltaSum
FROM S t1