|
Расчет накопительного итога по условию
|
|||
---|---|---|---|
#18+
Добрый день! Прошу помочь разобраться с написанием запроса по следующей задаче. Есть таблица оборота по карте клиента в день, где Ow_id уникальный идентификатор клиента Day Расчетный день POS Оборот по карте Например: Ow_id Day POS 1 12.02.2016 2500 1 13.02.2016 1000 1 14.02.2016 700 2 12.02.2016 3000 2 13.02.2016 4500 2 14.02.2016 300 За каждую 1000 рублей клиенту начисляется 1 бонус. При этом, если клиент, например купил на 2500 руб. ему начислят 2 бонуса, а 500 рублей просуммируется к след покупке. Нужно написать скрипт, который считает начисленные бонусы на каждый день. Необходимо реализовать скрипт с помощью оконных функций и рекурсии, т е 2 способами Пока начал составлять с помощью оконных функции, но не слишком в них разбираюсь, получается примерно так SELECT Ow_id, Day, POS, floor(POS/1000) as b, -- кол-во бонусов за текущий день POS - 1000*floor(POS/1000) as rest, -- переходящий остаток для расчета бонусов на следующий день SUM(POS- 1000*floor(POS/1000)) OVER (PARTITION BY Ow_id ORDER BY Day RANGE UNBOUNDED PRECEDING) -- остатки накопительным итогом FROM Table ORDER BY Ow_id, Day; ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2020, 17:41 |
|
Расчет накопительного итога по условию
|
|||
---|---|---|---|
#18+
Всем спасибо за помощь, разобрался сам! Прилагаю решение, если кому-то будет интересно подобная задача. Оконные ф-ции: select Ow_id, Day, POS, floor(POS1/1000) as Bonus from (select tg.*, POS + coalesce(sum(tg.POS % 1000) over (partition by tg.Ow_id order by tg.Day rows between unbounded preceding and 1 preceding), 0) as POS1 from table tg) NewTable order by Ow_id, Day; Рекурсия (подзапрос) select Ow_id, Day, POS, floor(POS1/1000) as Bonus from (select g.*, g.pos + (select coalesce(sum(t2.POS % 1000), 0) from table3 t2 where g.Ow_id = t2.Ow_id and t2.Day < g.Day) as POS1 from table g) NewTable order by Ow_id, Day; ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 02:12 |
|
|
start [/forum/topic.php?fid=46&fpage=69&tid=1686483]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 133ms |
0 / 0 |