优化Vertica SQL查询以进行累计总数

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。有没有其他方法来生成累计数字?我确实查看了这里的解决方案: Running total by grouped records in table。 我使用的RDBMs是Vertica。Vertica SQL排除了那里的第一个子选择解决方案,其查询计划器预测第二个左外连接解决方案的成本大约是我上面展示的分析形式的100倍。

你为这个表定义了哪些投影?有多少行和不同的键?“非常慢”指的是多慢? - user955473
你的表中有多少行数据?你是如何对该表进行主投影的分区/分段的? - mtrbean
我很难理解!你能否提供一些样本数据和所需的输出? - AK47
这可能会有所帮助:https://dev59.com/iXI95IYBdhLWcg3w2h56 - zinking
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/

-1
有时候只使用相关子查询会更快:
SELECT 
    [key]
    , [day]
    , delta
    , (SELECT SUM(delta) FROM S WHERE [key] < t1.[key]) AS DeltaSum
FROM S t1

Vertica不支持这种类型的相关子查询。 - duber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接