Оптимизация запроса Vertica SQL для выполнения промежуточных итогов

У меня есть таблица S с такими данными временных рядов:

key   day   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 предложение окна по умолчанию - RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, но я оставил это здесь, чтобы быть явным.

Этот запрос действительно медленный, примерно на порядок медленнее, чем старый неработающий запрос, в котором для совокупного счета были заполнены нули. Есть ли предложения по другим методам создания кумулятивных чисел?

Я рассмотрел решения здесь: Общая сумма по сгруппированным записям в стол

Я использую RDBM - Vertica. Vertica SQL исключает первое решение с подвыбором, а его планировщик запросов предсказывает, что решение второго левого внешнего соединения примерно в 100 раз дороже, чем аналитическая форма, которую я показываю выше.


person user879681    schedule 05.08.2011    source источник
comment
Какие прогнозы вы определили для этой таблицы? Сколько строк и разных ключей? Насколько медленно очень медленно?   -  person    schedule 20.09.2011
comment
Сколько строк у вас в таблице? Как вы разбиваете / сегментируете главную проекцию для этой таблицы?   -  person mtrbean    schedule 16.12.2013
comment
Мне очень сложно понять! Не могли бы вы предоставить образцы данных с требуемым выводом?   -  person AK47    schedule 05.04.2014
comment
stackoverflow.com/questions/2120544/how-to-get -cumulative-sum это может помочь   -  person zinking    schedule 10.04.2014


Ответы (2)


Я думаю, что вы по сути там. Возможно, вам просто нужно немного обновить синтаксис:

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/
person Robert Pak    schedule 27.04.2020

Иногда быстрее использовать коррелированный подзапрос:

SELECT 
    [key]
    , [day]
    , delta
    , (SELECT SUM(delta) FROM S WHERE [key] < t1.[key]) AS DeltaSum
FROM S t1
person Russell Fox    schedule 27.05.2014
comment
Vertica не поддерживает коррелированные подзапросы такого рода. - person duber; 11.11.2014