使用 partition by 和 case when

Posted

技术标签:

【中文标题】使用 partition by 和 case when【英文标题】:Using partition by and case when 【发布时间】:2019-06-09 21:39:08 【问题描述】:

总结一下我正在尝试做的事情:

我有一堆区域,其中一个包含很多产品。我已经计算了每种产品的折扣,产品的平均折扣(按地区划分)以及它们的标准差(也按地区划分)。

现在,我需要计算一个新的平均折扣(再次按地区划分),但只考虑 discount

的产品
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
)

我想要什么:

【问题讨论】:

样本数据和期望的结果会有所帮助。并显示您编写的查询。 【参考方案1】:

我有点不清楚你想要什么结果。根据您的描述,聚合似乎足以获得最终结果。

无论如何,我们的想法是使用子查询或 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;

【讨论】:

我不想丢失任何数据。我所需要的只是计算新的区域平均折扣,但现在使用的标准是,在计算中必须只使用低于之前平均 + 标准差的折扣值

以上是关于使用 partition by 和 case when的主要内容,如果未能解决你的问题,请参考以下文章

如何在 over 函数中使用 partition by 和 order by?

如何在 Snowflake sql 中使用 partition by 和 order by 计算不同的值?

spark shuffle partitions 和 partition by tag 如何相互配合

Oracle LISTAGG() 聚合查询用法 GROUP BY 和 PARTITION BY 的使用和比较

【SQL】partition by

oracle用partition by