Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Запрос суммы по нарастанию года.  [new]
Vladislav1987
Member

Откуда:
Сообщений: 7
Добрый день.

Бьюсь весь день над задачей.

Есть таблица:

year, accrual
2015, 1
2016, 5
2017, 4
2018, 9
2019, 14
2020, 27

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

Результат:
year, accrual, result
2015, 1, 1
2016, 5, 6
2017, 4, 6
2018, 9, 15
2019, 14, 15
2020, 27, 42

Вот таблица:

CREATE TABLE Quest5(year integer PRIMARY KEY, accrual integer);

INSERT INTO Quest5 VALUES(2015, 1);
INSERT INTO Quest5 VALUES(2016, 5);
INSERT INTO Quest5 VALUES(2017, 4);
INSERT INTO Quest5 VALUES(2018, 9);
INSERT INTO Quest5 VALUES(2019, 14);
INSERT INTO Quest5 VALUES(2020, 27);

Сообщение было отредактировано: 28 мар 21, 21:11
28 мар 21, 21:08    [22301176]     Ответить | Цитировать Сообщить модератору
 Re: Запрос суммы по нарастанию года.  [new]
Vladislav1987
Member

Откуда:
Сообщений: 7
CREATE TABLE Quest5(year integer PRIMARY KEY, accrual integer);

INSERT INTO Quest5 VALUES(2015, 1);
INSERT INTO Quest5 VALUES(2016, 5);
INSERT INTO Quest5 VALUES(2017, 4);
INSERT INTO Quest5 VALUES(2018, 9);
INSERT INTO Quest5 VALUES(2019, 14);
INSERT INTO Quest5 VALUES(2020, 27);
28 мар 21, 21:09    [22301177]     Ответить | Цитировать Сообщить модератору
 Re: Запрос суммы по нарастанию года.  [new]
Vladislav1987
Member

Откуда:
Сообщений: 7
Удалось собрать только нарастающую сумму.

select s.*,
s.accrual + (select coalesce(sum(t2.accrual), 0)
from Quest5 as t2
where t2.year < s.year) as total
from Quest5 as s
order by s.year;
28 мар 21, 21:13    [22301179]     Ответить | Цитировать Сообщить модератору
 Re: Запрос суммы по нарастанию года.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4691
Vladislav1987,

Интересная задача...
сейчас попробую запрос вам сообразить.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
28 мар 21, 21:30    [22301188]     Ответить | Цитировать Сообщить модератору
 Re: Запрос суммы по нарастанию года.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4691
Vladislav1987,

как то так вот

WITH RECURSIVE
_start AS (
  SELECT year,accrual,accrual AS result FROM Quest5 ORDER BY year LIMIT 1
),
_t AS 
(
  SELECT * FROM _start
  UNION ALL
  SELECT _q.year, _q.accrual, CASE WHEN _q.accrual<_t.result THEN _t.result ELSE _t.result+_q.accrual END AS result
  FROM _t, LATERAL (SELECT * FROM Quest5 WHERE Quest5.year>_t.year ORDER BY Quest5.year LIMIT 1) AS _q
)
SELECT * FROM _t ORDER BY year;


 year | accrual | result 
------+---------+--------
 2015 |       1 |      1
 2016 |       5 |      6
 2017 |       4 |      6
 2018 |       9 |     15
 2019 |      14 |     15
 2020 |      27 |     42


Мне не кажется что задача решается без ручного цикла через рекурсию (по своей постановке просто).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru

Сообщение было отредактировано: 28 мар 21, 21:36
28 мар 21, 21:43    [22301193]     Ответить | Цитировать Сообщить модератору
 Re: Запрос суммы по нарастанию года.  [new]
Vladislav1987
Member

Откуда:
Сообщений: 7
Maxim Boguk,

Огромное спасибо. Кажется работает. Постараюсь разобраться что к чему.
28 мар 21, 21:46    [22301195]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить