点击关注公众号,干货第一时间送达

本题需要计算平均数,
之前的文章出现过 "sum() over() ",也就是"开窗求和"
所以,聪明的你肯定预判到了,
我们将会用到 "avg() over()"
话不多说,走起!
【温馨提示:建表语句及数据导入脚本,可以翻看前面的文章:
SQL脚本案例【9】查询各品类销售商品的种类数、及销量最高的商品】
一、需求场景
题目:
从订单明细表order_detail中,查询销量高于所属品类平均销量的商品。
涉及到三张表,
订单明细表order_detail:

商品信息表sku_info:

品类信息表category_info:

正确结果:

二、解决方案
演示工具:Hive-3.1.3 + DataGrip2022
解题思路是:求出各个商品的销量,再通过join关联得到所属品类,
计算品类平均销量,最后筛选出符合条件的即可。
(1)分组计算每个商品的累积销量
select sku_id, sum(sku_num) as amt
from order_detail
group by sku_id
结果集:

(2)通过join,关联sku_info、category_info获取品类信息,并通过开窗平均计算,得出商品所属品类的平均销量
select t1.sku_id, t2.name, t2.category_id, t1.amt,
avg(t1.amt) over (partition by t2.category_id) as avgAmt
from (
select sku_id, sum(sku_num) as amt
from order_detail
group by sku_id
)t1
join sku_info t2
on t1.sku_id=t2.sku_id
join category_info t3
on t2.category_id=t3.category_id
(3)筛选出销量大于平均销量的商品即可
select *
from (
select t1.sku_id, t2.name, t2.category_id, t1.amt,
avg(t1.amt) over (partition by t2.category_id) as avgAmt
from (
select sku_id, sum(sku_num) as amt
from order_detail
group by sku_id
)t1
join sku_info t2
on t1.sku_id=t2.sku_id
join category_info t3
on t2.category_id=t3.category_id
)t4
where amt>avgAmt
结果集:


文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




