172 похожих чатов

Всем привет, а не подскажите, как можно посчитать коммулятив с

разрывами

select my_tbl.*,
sum(amount) over (partition by user_id, types order by id) how_calculate
from (values (123654987, 100, 'A', 1, 100),
(123654987, 100, 'B', 2, 100),
(123654987, 60, 'A', 3, 60),
(123654987, 80, 'A', 4, 140),
(123654987, 50, 'B', 5, 50),
(123654987, 75, 'B', 6, 125)
) my_tbl(user_id, amount, types, id, cor_amount);

cor_amount - это сумма которая должна получиться

Или это только через lag бегать туда сюда ?

Спасибо!

6 ответов

26 просмотров

> Или это только через lag бегать туда сюда ? Смотря в каком смысле. ;) А так (если я правильно понял) — это же "стандартная" задача gaps-and-islands, т.е.: 1. Находите точки изменения групп (если types = LAG(types) (PARTITION BY user_id ORDER BY id), то это та же группа). 2. Находите номера групп (SUM/COUNT предыдущего этапа). 3. Получаете "кумулятивы" внутри них, т.е. SUM(amount) OVER (PARTITION BY user_id, grp ORDER BY id). И всё, казалось бы...

Chern-Oleksander Автор вопроса
Yaroslav Schekin
> Или это только через lag бегать туда сюда ? Смо...

Спасибо почитаю про gaps-and-island -не слышал про такое. НО проблема не 1. Находите точки изменения групп (если types = LAG(types) (PARTITION BY user_id ORDER BY id), то это та же группа). Я же смогу так только точку изменения найти, а как мне определить группу(колво), их может быть Х Также задачу нужно решить без переменной. Еще конечно почитаю про это гап-остров. Спасибо!

Chern Oleksander
Спасибо почитаю про gaps-and-island -не слышал про...

> Я же смогу так только точку изменения найти, а как мне определить групп Я же набросал, как это делать шаг за шагом. Нахождение точек изменения — только первый шаг, см. далее. > Также задачу нужно решить без переменной. В смысле? Хмм... Вам же примерно вот это нужно, я правильно понял? WITH b AS ( SELECT my_tbl.* FROM ( VALUES (123654987, 100, 'A', 1, 100), (123654987, 100, 'B', 2, 100), (123654987, 60, 'A', 3, 60), (123654987, 80, 'A', 4, 140), (123654987, 50, 'B', 5, 50), (123654987, 75, 'B', 6, 125) ) AS my_tbl(user_id, amount, types, id, cor_amount) ), flags AS ( SELECT *, types IS DISTINCT FROM LAG(types) OVER w AS group_change_flag FROM b WINDOW w AS (PARTITION BY user_id ORDER BY id) ) , group_nums AS ( SELECT *, COUNT(*) FILTER (WHERE group_change_flag) OVER w AS grp_num FROM flags WINDOW w AS (PARTITION BY user_id ORDER BY id) ) SELECT *, SUM(amount) OVER wgroup AS calculated_amount FROM group_nums WINDOW wgroup AS (PARTITION BY user_id, grp_num ORDER BY id) ORDER BY user_id, id;

Chern-Oleksander Автор вопроса
Yaroslav Schekin
> Я же смогу так только точку изменения найти, а к...

них*ена себе, извините а что это такое SELECT *, types IS DISTINCT FROM LAG(types) OVER w AS group_change_flag хочу почитать, про это И вот это COUNT(*) FILTER (WHERE group_change_flag) это типа как KEEP в ORACLE ? Огромнеешее спасибо, еще буду читать

Chern Oleksander
них*ена себе, извините а что это такое SELECT *,...

> а что это такое Ну так это и есть определение точки изменения... или Вы про IS DISTINCT FROM? Это вот тут: https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE (мне просто показалось, что так будет короче записать в этом примере, чтобы с NULL-ом не разбираться как-то иначе). Если про OVER w — это использование окна, объявленного в WINDOW. > И вот это <skip> это типа как KEEP в ORACLE ? Это типа как фильтрованные агрегаты (здесь использован как оконная функция) из ISO SQL. ;) См. https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-AGGREGATES

Chern-Oleksander Автор вопроса
Yaroslav Schekin
> а что это такое Ну так это и есть определение ...

» или Вы про IS DISTINCT FROM Да вот это первый раз вижу (( Спасибо »Это типа как фильтрованные агрегаты (здесь использован как оконная функция) из ISO SQL. что-то я в этой жизни не доглядел ( Спасибо большое

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта