dromenkojunior
@dromenkojunior
Tableau, python, SQL

Как переносить баланс на следующие дни?

Таблица активности пользователя за каждый час и балансом за этот час. Но пользователь может быть неактивен несколько дней и баланс должен перенестись в подсчетах на следующий день. Необходимо посчитать сумму балансов пользователей за каждый день.
Пронумеровал
ROW_NUMBER ( ) OVER ( PARTITION BY DATE :: DATE, userid ORDER BY DATE DESC )
и взял последнюю (максимальную) запись за день пользователя.
Получил на входе:
date | userid | balance
2022-01-01 | 123 | 1000
2022-01-05 | 123 | 500

Что хочу получить на выходе:
2022-01-01 | 123 | 1000
2022-01-02 | 123 | 1000
2022-01-03 | 123 | 1000
2022-01-04 | 123 | 1000
2022-01-05 | 123 | 500

lag() и lead() берут только по одной строке, а разрыв между активностями может быть больше. Как это сделать?
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
iMedved2009
@iMedved2009
Не люблю людей
WITH

  balance(userid, date, balance_amount) AS (

    VALUES ('1112879', DATE '2022-08-05',700),

           ('1112879', DATE '2022-08-15',1500),

           ('1112879', DATE '2022-08-18',10100),

           ('1112879', DATE '2022-08-22',1700),

           ('1112879', DATE '2022-09-01',4200)

  )

select
    day::date,
	(select balance_amount from balance as t where t.userid = balance.userid and (day::date - t.date::date)>=0 ORDER BY abs(day::date - t.date::date) asc limit 1) as amount,
	balance.userid
from
    generate_series('2022-08-01'::date, now()::date, '1 day'::interval) as day
cross join (select userid from balance group by userid) as balance
ORDER BY day;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы