Рекурсивный столбец в sql (postgresql) - PullRequest
0 голосов
/ 22 октября 2018

У меня есть уравнение:

result[n] = least(0, x[n] + result[n-1])

, которое должно создать такую ​​таблицу

  x  | result
--------------
 100 |     0  // least(100+0, 0) = 0
  50 |     0  // least(50+0, 0) = 0
-100 |  -100  // least(-100+0, 0) = -100
  50 |   -50  // least(50-100, 0) = -50

Я бы хотел как-то использовать его в запросе SQL длятаблица значений х.Я думал о lag функции, подобной этой:

select
    *,
    greatest(0, lag(result) over (order by i) + "table1"."value") as result
from
    table1

, но, конечно, она не будет работать, так как в таблице нет столбца результатов.

У вас есть идеи, какдобиться такой рекурсии в SQL (PostgreSQL)?

1 Ответ

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

Таблицы SQL представляют неупорядоченные наборы.Вы можете сделать это, но я должен предположить, что у вас есть столбец, определяющий порядок.

Если это так, вы можете использовать рекурсивный CTE:

with recursive t as (
      select v.*
      from (values (1, 100), (2, 50), (3, -100), (4, 50)) v(id, x)
    ),
    cte(id, x, result) as (
     select id, x, least(x, 0)
     from t
     where id = 1
     union all
     select t.id, t.x, least(t.x + cte.result, 0)
     from cte join
          t
          on t.id = cte.id + 1
    )
select cte.*
from cte
order by id;

Здесь это дБ <> скрипка.

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