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

时间:2011-08-05 01:08:24

标签: sql vertica window-functions running-total

我有一张表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倍。

2 个答案:

答案 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