Как получить среднее квартальное и последнее полугодовое сальдо за каждый месяц в улье? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть таблица с колонкой cust_id, year_, month_, monthly_txn, monthly_bal. я нуждаюсь рассчитать предыдущие три месяца и предыдущие шесть месяцев avg(monthly_txn) и variance(monthly_bal) для каждого месяца. У меня есть запрос, который возвращает средние и дисперсии за последние три и шесть месяцев только за последний месяц, а не за каждый месяц. Я не хорош в аналитической функции в Улье.

  SELECT cust_id, avg(monthly_txn)y,variance(monthly_bal)x, FROM ( 
  SELECT cust_id, monthly_txn,monthly_bal,
            row_number() over (partition by cust_id order by year_,month_ desc) r
        from mytable) b WHERE r <= 3 GROUP BY cust_id

Но я хочу что-то вроде ниже.

ввод:

 cust_id     year_   month_     monthly_txn  monthly_bal
1            2018     1              456    8979289
1            2018     2              675    4567
1            2018     3              645    4890
1            2017     1              342    44522
1            2017     2              378    9898900
1            2017     2              456    234492358
1            2017     4              3535   789
1            2017     5              456    345
1            2017     6              598    334

ожидаемый результат:

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

cust_id     year_    month_     monthly_txn  monthly_bal     q_avg_txn            h_avg_txn
   1         2018      1          456          8979289       avg(456,598,4561)    avg(456,598,4561,3535,4536,378)
   1         2018      2          675          4567          avg(675,456,598)     avg(675,456,3535,4561,598,4536)
   1         2018      3          645          4890          avg(645,675,645)     avg(645,675,645,3535,4561,598)
   1         2017      1          342          44522         avg(342)             avg(342)
   1         2017      2          378          9898900       avg(378,342)         avg(378,342)
   1         2017      3          4536         234492358     avg(4536,372,342)    avg(4536,378,342)
   1         2017      4          3535         789           avg(3535,4536,378)   avg(3535,4536,378,342) 
   1         2017      5          4561         345           avg(4561,3535,4536)  avg(4561,3535,4536,342,378)
   1         2017      6          598          334           avg(598,4561,3535)   avg(598,4561,3535,4536,342,378) 

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Если у вас есть данные за каждый интересующий месяц (т. Е. Без пропусков), то это должно работать:

select t.*,
       avg(monthly_bal) over (partition by cust_id
                              order by year_, month_ 
                              rows between 2 preceding and current row
                             ) as avg_3,
       avg(monthly_bal) over (partition by cust_id
                              order by year_, month_ 
                              rows between 5 preceding and current row
                             ) as avg_6,
       variance(monthly_bal) over (partition by cust_id
                                   order by year_, month_ 
                                   rows between 2 preceding and current row
                                  ) as variance_3,
       variance(monthly_bal) over (partition by cust_id
                                   order by year_, month_ 
                                   rows between 5 preceding and current row
                                  ) as variance_6
from mytable t;
0 голосов
/ 09 мая 2018

используйте unbounded preceding аналитические функции (/ * для получения значений за квартал и полугодие), а затем используйте подзапрос для получения результатов.

Для чего используется строка RBOS UNBOUNDED PRECEDING в Teradata?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...