Вы можете использовать оконные функции с правильным предложением rows
. На этот раз нам пригодится distinct
:
select distinct
acc,
dte,
count(*) over(
partition by acc
order by dte
rows between unbounded preceding and 1 preceding
) num_of_dates,
avg(1.0 * amount) over(
partition by acc
order by dte
rows between unbounded preceding and 1 preceding
) avg_amount_per_day,
sum(amount) over(partition by acc, dte) current_amount
from mytable
Если вам нужна только одна запись на дату и учетную запись, как показано в примере данных, вы можете вложить запрос и использовать row_number()
- в Отсутствие очевидного столбца для определения порядка сортировки, я полагался на совокупный счет:
select acc, dte, num_of_dates, avg_amount_per_day, current_amount
from (
select
t.*,
row_number() over(partition by acc, dte order by num_of_dates) rn
from (
select
acc,
dte,
count(*) over(
partition by acc
order by dte
rows between unbounded preceding and 1 preceding
) num_of_dates,
avg(1.0 * amount) over(
partition by acc
order by dte
rows between unbounded preceding and 1 preceding
) avg_amount_per_day,
sum(amount) over(partition by acc, dte) current_amount
from mytable
) t
) t
where rn = 1 and avg_amount_per_day is not null
Демонстрация на DB Fiddlde :
acc | dte | num_of_dates | avg_amount_per_day | current_amount
--: | :--------- | -----------: | :----------------- | -------------:
1 | 2020-01-03 | 1 | 100.000000 | 200
1 | 2020-01-08 | 2 | 150.000000 | 175
2 | 2020-01-02 | 1 | 50.000000 | 100
2 | 2020-01-03 | 2 | 75.000000 | 200
3 | 2020-01-06 | 1 | 100.000000 | 75
3 | 2020-01-08 | 2 | 87.500000 | 75
3 | 2020-01-10 | 3 | 83.333333 | 350