Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / PostgreSQL |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Maxim Boguk Member Откуда: Melbourne, Австралия Сообщений: 4691 |
Vladislav1987, Интересная задача... сейчас попробую запрос вам сообразить. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru |
28 мар 21, 21:30 [22301188] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Vladislav1987 Member Откуда: Сообщений: 7 |
Maxim Boguk, Огромное спасибо. Кажется работает. Постараюсь разобраться что к чему. |
28 мар 21, 21:46 [22301195] Ответить | Цитировать Сообщить модератору |
Все форумы / PostgreSQL | ![]() |