Использование разбиения по и случай, когда - PullRequest
0 голосов
/ 10 июня 2019

Подводя итог, что я пытаюсь сделать:

У меня есть несколько регионов, в которых много товаров.Я рассчитал скидку для каждого продукта, среднюю скидку для продуктов (разделенных по регионам), а также их стандартное отклонение (также разделенных по регионам).

Теперь мне нужно рассчитать новую среднюю скидку(снова разделено по регионам), но с учетом только продуктов, которые скидка

select  product,
        discount,
        region,
--this is the line i want to add
        avg (case when discont < avg_discount + stddev_discount then discount) over(partition by region) end as new_discount*
from (
  select product,
         discount,
         region,
         avg(discount) over (partition by region) as avg_discount,
         stddev(discount) over (partition by region) as stddev_discount
  from base
)

Что я хочу:

what i want:

1 Ответ

0 голосов
/ 10 июня 2019

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

В любом случае идея состоит в том, чтобы использовать подзапрос или CTE.Примерно так:

select region, avg(discount)
from (select t.*,
             avg(discount) over (partition by region) as region_avg,
             stddev(discount) over (partition by region) as region_stddev
      from t
     ) t
where discount < region_avg + region_stdev
group by region;

РЕДАКТИРОВАТЬ:

Вы можете настроить это для использования оконных функций:

select t.*,
       avg(case when discount < region_avg + region_stdev then discount end) over (region) as new_avg
from (select t.*,
             avg(discount) over (partition by region) as region_avg,
             stddev(discount) over (partition by region) as region_stddev
      from t
     ) t;
...