Сгруппированная условная сумма в Oracle SQL - PullRequest
0 голосов
/ 13 февраля 2020

my_table показывает остаток на счете по кредитам каждого человека N месяцев a go. Из этой таблицы я хочу получить месячную сумму балансов каждого человека за последние 2 и 3 месяца и разделить каждую сумму на 2 и 3 соответственно (то есть, скользящую среднюю суммы баланса за последние 2 и 3 месяца). ).

Обратите внимание, что мне нужна сумма баланса за прошедшие М месяцев, деленная на М месяцев.

PERSON_ID  CRED_ID  MONTHS_BEFORE  BALANCE
       01       01              1     1100
       01       01              2     1500
       01       01              3     2000
       01       02              1       50
       01       02              2      400
       01       02              3      850
       02       06              1      300
       02       06              2      320
       02       11              1     7500
       02       11              2    10000

Один способ сделать это:

select
    person_id, sum(balance) / 2 as ma_2
from
    my_table
where
    months_before <= 2
group by
    person_id

и объединить этот результат с

select
    person_id, sum(balance) / 3 as ma_3
from
    my_table
where
    months_before <= 3
group by
    person_id

Я хочу знать, можно ли это обработать с помощью case или условной суммы или что-то вроде этого:

select
    person_id,
    sum(balance) over (partition by person_id when months_before <= 2) / 2 as ma_2,
    sum(balance) over (partition by person_id when months_before <= 3) / 3 as ma_3
from
    my_table

Желаемый результат будет выглядеть следующим образом:

PERSON_ID     MA_2     MA_3
       01  1525.00  1966.66
       02  9060.00  9060.00   

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Если эти два запроса дают то, что вы хотите, и вам нужно объединить их, тогда только ma_2 нужна условная сумма:

select person_id, 
       sum(case when months_before <= 2 then balance end) / 2  as ma_2,
       sum(balance) / 3 as ma_3
  from my_table
  where months_before <= 3
  group by person_id

dbfiddle

0 голосов
/ 13 февраля 2020

Если бы у вас был столбец «месяц», вы бы использовали оконную функцию:

select t.*,
       avg(balance) over (partition by person_id
                          order by month
                          rows between 2 preceding and current row
                         ) as avg_3month
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...