PostgreSQL - завершение серии - PullRequest
       1

PostgreSQL - завершение серии

0 голосов
/ 08 октября 2018

У меня есть ряд, и вот простая формула, где x = вчера, а y = три дня назад:

x + (x - y) / 2

В Excel вычисление вышеуказанных рядов легко.Но вот примерный набор данных, в котором я хотел бы завершить серию на основе предыдущих значений.Обратите внимание, что фактические данные просто поступают из набора данных.Таким образом, у нас есть данные от 01.01.2008, 1/2/2018 и 03.01.2017.Затем мы хотели бы предсказать с 1/4/2018 по 1/8/2018 на основе приведенной выше формулы:

      A (dt)    B (sum)   excel equivalent
row1  1/1/2018  1         (actual)
row2  1/2/2018  2         (actual)
row3  1/3/2018  5         (actual)
row4  1/4/2018  7         (predicted) =B3 + ((B3 - B1) / 2)
row5  1/5/2018  9.5       (predicted) =B4 + ((B4 - B2) / 2)
row6  1/6/2018  11.75     (predicted) =B5 + ((B5 - B3) / 2)
row7  1/7/2018  14.125    (predicted) =B6 + ((B6 - B4) / 2)
row8  1/8/2018  16.4375   (predicted) =B7 + ((B7 - B5) / 2) 

Я знаю, что вы достигните кумулятивной суммы, используя Partition By, однако у меняпроблема с измененными накопительными суммами, такими как выше.Есть ли способ сделать это в PostgreSQL?

Вот скриншот из excel:

enter image description here

1 Ответ

0 голосов
/ 08 октября 2018

Это сложная проблема.Вот решение с использованием рекурсивного CTE:

with recursive cte as (
      select 1 as n, 1::numeric as x, null::numeric as x_1, null::numeric as x_2
      union all
      select n + 1, 
             (case n + 1 when 2 then 2 when 3 then 5
                   else x + (x - x_2) / 2
              end) as x,
             x as x_1, x_1 as x_2
      from cte 
      where n < 10
     )
select *
from cte;

Наряду с db <> fiddle .

Идея состоит в том, чтобы повернуть исторические значения, которые вам нужныотдельные столбцы.Обратите внимание, что формула имеет значение x + (x - x_2) / 2, а не x_1 + (x_1 - x_3) / 2, поскольку при этом используются значения из предыдущей строки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...