Табличный расчет без учета фильтров - PullRequest
0 голосов
/ 17 февраля 2020

Мои данные выглядят так:

endtimestamp|account|volume|pk|var1

jan-1, conosco, 123, 13231, a
jan-1, conosco, 123, 13231, b 
jan-1, conosco, 123, 13231, c 
jan-1, acme, 1323, 2123123, a
jan-1, acme, 1323, 2123123, b
jan-1, acme, 1323, 2123123, c
jan-2, conosco, 128, 131231, a
jan-2, conosco, 128, 131231, b
jan-2, conosco, 128, 131231, c
jan-2, acme, 1329, 31323, a
jan-2, acme, 1329, 31323, b
jan-2, acme, 1329, 31323, c
...

У меня есть расчет, чтобы получить сумму на основе фильтра

Назовите ее fixed_sum_volume

sum({FIXED [pk], [account]: max([volume])})

У меня есть два фильтра

endtimestamp

account

Когда выбран диапазон дат Jan 1 и выбран аккаунт ACME

fixed_sum_of_volume даст мне сумму диапазона дат - 1323

Мне нужно разделить это на среднее значение за все время , и я не могу понять, как сделать это или, если это возможно, даже с таблицей.

Кажется, это было бы легко, но я уже некоторое время боролся с этим.

В общем, я ищу:

avg (отфильтрованный объем) / avg (не отфильтрованный объем)

1 Ответ

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

Ну, я не уверен, что сумма (x) / avg (y) дает вам, но ниже это выполняет. Кстати, ваше значение «fixed_sum_of_volume», указанное выше, неверно. У вас есть 3 строки для счета «acme» на дату «Jan-1», каждая на 1323, следовательно, сумма составляет 3969.

with mytbl (endtimestamp,account,volume,pk,var1)  as
   ( values   (to_date('jan-1','mon-dd'), 'conosco', 123, 13231, 'a')
            , (to_date('jan-1','mon-dd'), 'conosco', 123, 13231, 'b')
            , (to_date('jan-1','mon-dd'), 'conosco', 123, 13231, 'c')
            , (to_date('jan-1','mon-dd'), 'acme', 1323, 2123123, 'a')
            , (to_date('jan-1','mon-dd'), 'acme', 1323, 2123123, 'b')
            , (to_date('jan-1','mon-dd'), 'acme', 1323, 2123123, 'c')
            , (to_date('jan-2','mon-dd'), 'conosco', 128, 131231, 'a')
            , (to_date('jan-2','mon-dd'), 'conosco', 128, 131231, 'b')
            , (to_date('jan-2','mon-dd'), 'conosco', 128, 131231, 'c')
            , (to_date('jan-2','mon-dd'), 'acme', 1329, 31323, 'a')
            , (to_date('jan-2','mon-dd'), 'acme', 1329, 31323, 'b')
            , (to_date('jan-2','mon-dd'), 'acme', 1329, 31323, 'c')
     )
select account, fixed_sum_of_volume, average_of_all_time, fixed_sum_of_volume/average_of_all_time "sum(filtered volume)/avg(non filtered volume)?"
  from 
       ( select m.account
              , sum(m.volume) filter (where to_date('jan-1','mon-dd') = m.endtimestamp) over() fixed_sum_of_volume
              , (select avg(m2.volume) from mytbl m2 where m2.account = 'acme' group by m2.account) average_of_all_time
           from mytbl m
          where m.account = 'acme' 
       ) a; 
...