8

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

key   day   delta

对于给定的密钥,可能但不太可能会丢失几天。

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

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

在我的 SQL 风格中,默认窗口子句是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,但我把它留在那里是明确的。

这个查询真的很慢,比旧的损坏查询慢了一个数量级,它用 0 填充累积计数。对于其他生成累积数字的方法有什么建议吗?

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

我使用的 RDBM 是 Vertica。Vertica SQL 排除了第一个子选择解决方案,它的查询计划器预测第二个左外连接解决方​​案的成本大约是我上面显示的分析形式的 100 倍。

4

2 回答 2

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/
于 2020-04-27T16:21:13.253 回答
-1

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

SELECT 
    [key]
    , [day]
    , delta
    , (SELECT SUM(delta) FROM S WHERE [key] < t1.[key]) AS DeltaSum
FROM S t1
于 2014-05-27T17:28:26.037 回答