使用 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 如何相互配合