powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / нарастающий итог (+)
15 сообщений из 15, страница 1 из 1
нарастающий итог (+)
    #35540258
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно ли получить в селекте нарастающий итог? (не используя функции)
1; sum()=1
2; sum()=3
3; sum()=5
...
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #35540603
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
было где-то на форуме, через 'custom' переменные... только этож вызов функций... типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select set_config('custom.prev', '0', false); --- текущее значение строки (изначально ноль)

select a, "нарастающий итог" --- вернуть только тек. значение строки и нарастающий итог
from (
  select
    a, --- тек. значение строки
    a + current_setting('custom.prev')::int as "нарастающий итог", --- просуммировать тек. строку с запомненным значением
    set_config('custom.prev', a::text, false) --- запомнить тек. значение
  from (
    --- источник данных
    values ( 1 ), ( 2 ), ( 3 )
    order by  1  --- порядок в котором входные строки попадают в сумматор
  ) as x(a)
) as vtbl;

правда оператор '+' - это же тоже функция :)


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #35540983
Пусть дана таблица T:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select * from t;

Query finished, retrieving results...

NUM
---
   1 
   2 
   3 

 3  row(s) retrieved;

Тогда стандартными средствами, совместимыми с ANSI-SQL, решить поставленную задачу можно как минимум двумя способами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 1 )
select t0.num, 
       (
         select sum(num)
           from t t1
          where t1.num <= t0.num
       ) as slide_sum
  from t t0

Query finished, retrieving results...

NUM   SLIDE_SUM
---   ---------
   1             1 
   2             3 
   3             6 

 3  row(s) retrieved;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 2 )
select t0.num, sum(t1.num) as slide_sum
  from t t0
  join t t1
    on t1.num <= t0.num
 group by t0.num


Query finished, retrieving results...

NUM   SLIDE_SUM
---   ---------
   1             1 
   2             3 
   3             6 

 3  row(s) retrieved;
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #35541052
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в последней строчке должно быть пять или шесть ?


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #35543517
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin, вы правильно сформулировали вопрос. попробуйте поискать "нарастающий итог" по разделу postgresql на форуме.
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #35544600
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо!
LeXa NalBat вы правильно сформулировали вопрос
я вначале искал по неправильным словам, а потом сформулировал -(
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
нарастающий итог (+)
    #38628098
HAL-LYNX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхПусть дана таблица T:


Отличный вариант!
Есть слегка усложнённый вариант - 2 таблицы!

1 Таблица (IN):
NUM
6
7
8

2 Таблица(OUT):
NUM
2
3

Необходимо стандартными средствами, совместимыми с ANSI-SQL одним запросом вывести нарастающий итог, при этом значения второй таблицы должны не суммироваться с общим итогом, а вычитаться. Бьюсь с этим вопросом и не могу решить
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #38628148
HAL-LYNX,

а в каком порядке должно происходить суммирование и вычитание входящих и исходящих значений?
Так-то все просто - "слить" данные в одну кучу через UNION ALL, при суммирование входящие значения брать как есть, а исходящие - со знаком минус...
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #38628499
HAL-LYNX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхHAL-LYNX,

а в каком порядке должно происходить суммирование и вычитание входящих и исходящих значений?
Так-то все просто - "слить" данные в одну кучу через UNION ALL, при суммирование входящие значения брать как есть, а исходящие - со знаком минус...

Вижу надо добавить ID! Результат запроса должен выглядеть так (с ID):

1 _IN_ 6 6
2 _IN_ 7 13
3 _IN_ 8 21
4 OUT 2 19
5 OUT 3 16

UNION ALL я использовал да. У меня получается сделать нарастающий итог, если таблица одна, с двумя как-то не складывается (
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #38628505
версия сервера поддерживает аналитические (оконные) функции?
если да, то рекомендую делать через sum() over(order by ...)
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #38628534
HAL-LYNX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не поддрживает, надо в рамках ANSI
Сейчас я пытаюсь для начала сделать нарастающий итог по двум таблицам, не обращая внимание на вычитание.
Через UNION сделал запрос и не пойму как из него выбрать его же + добавить столбец с нарастающим итогом
с одной таблицей у меня получается
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #38628564
ID - сквозной уникальный нумератор на обе таблицы? Или каждая таблица имеет свои ID и их значения могут пересекаться?

Если ID уникально на обе таблицы, то можно так попробовать: ссылко
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #38628581
HAL-LYNX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхID - сквозной уникальный нумератор на обе таблицы? Или каждая таблица имеет свои ID и их значения могут пересекаться?

Если ID уникально на обе таблицы, то можно так попробовать: ссылко

Работает!) Спасибо!!!

Проверил ID, да - каждая имеет свой (( Т.е. надо как-то иначе... возможно? Думаю как-то IN и OUT надо подвязать к ID и эту пару использовать как уникальный ID, я прав?
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #38628608
HAL-LYNX,

придется предварительно уникально перенумеровать всё множество, после чего делать расчет накопительного итога...
Как вариант лобового решения на стандартном ANSI-SQL: тынц

Но я бы много и сильно подумал, перед тем как запускать такой запрос на пром.базе
...
Рейтинг: 0 / 0
нарастающий итог (+)
    #38629011
HAL-LYNX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Да, в песочнице сначала всё запускаю, пока не заработает.
Сейчас мостырю всё это в свой исходный запрос, на основе тех, что ты дал) Спс тебе огромное!)
У меня всё усложнено тем, что в простом варианте просто ID, а у меня Дата + ID - это ключ и эти пары могут повторяться в таблицах IN и OUT... сижу ковыряю, ещё не закончил
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / нарастающий итог (+)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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