powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос суммы по нарастанию года.
6 сообщений из 6, страница 1 из 1
Запрос суммы по нарастанию года.
    #40057601
Vladislav1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

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

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

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);
...
Рейтинг: 0 / 0
Запрос суммы по нарастанию года.
    #40057602
Vladislav1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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);
...
Рейтинг: 0 / 0
Запрос суммы по нарастанию года.
    #40057604
Vladislav1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалось собрать только нарастающую сумму.

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;
...
Рейтинг: 0 / 0
Запрос суммы по нарастанию года.
    #40057609
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladislav1987,

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


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Запрос суммы по нарастанию года.
    #40057613
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladislav1987,

как то так вот

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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
...
Рейтинг: 0 / 0
Запрос суммы по нарастанию года.
    #40057614
Vladislav1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Огромное спасибо. Кажется работает. Постараюсь разобраться что к чему.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос суммы по нарастанию года.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]