HiveSQL 面试题 - 查询累积销售件数高于其所属品类平均数的商品

文章提供了解决方案,通过SQL查询从订单明细表和商品信息表中,利用开窗函数计算每个商品的累积销售件数以及所属品类的平均销售件数,然后筛选出销售件数高于品类平均数的商品。
摘要由CSDN通过智能技术生成

1 需求

从订单明细表(order_detail)中查询累积销售件数高于其所属品类平均数的商品。

  • 商品信息表 sku_info
sku_id(商品id)name(商品名称)category_id(分类id)from_date(上架日期)price(商品价格)
1xiaomi 1012020-01-012000
6洗碗机22020-02-012000
9自行车32020-01-011000
  • 订单明细表 order_detail1
order_detail_id(订单明细id)order_id(订单id)sku_id(商品id)create_date(下单日期)price(商品单价)sku_num(商品件数)
1112021-09-302000.002
2132021-09-305000.005
221042020-10-026000.001
231052020-10-02500.0024
241062020-10-022000.005
  • 期望结果
sku_id name sum_num cate_avg_num
2手机壳60441546
5破壁机242194
7热水壶252194
8微波炉253194
12遮阳伞206825373

2 解答

  • 思路

使用开窗函数统计基本指标再做统计即可,参考如下实现方案

  • 实现

1 使用开窗函数,统计基本指标

select sku_info.sku_id,
       name,
       category_id,
       sum(sku_num) over (partition by sku_info.sku_id)                sum_sku,
       sum(sku_num) over (partition by category_id)                    sum_cate,
       count(DISTINCT sku_info.sku_id) over (partition by category_id) num_cate
from sku_info
     inner join order_detail on sku_info.sku_id = order_detail.sku_id
sku_idnamecategory_idsum_skusum_catenum_cate
1xiaomi 1015161844
1xiaomi 1015161844
1xiaomi 1015161844
1xiaomi 1015161844
1xiaomi 1015161844
1xiaomi 1015161844
1xiaomi 1015161844
1xiaomi 1015161844
1xiaomi 1015161844
1xiaomi 1015161844
2手机壳1604461844
2手机壳1604461844

2 计算每个品类下的平均件数,并对数据进行去重

select sku_id,
       name,
       sum_sku                          sum_num,
       cast(sum_cate / num_cate as int) cate_avg_num
from (
         select sku_info.sku_id,
                name,
                category_id,
                sum(sku_num) over (partition by sku_info.sku_id)                sum_sku,
                sum(sku_num) over (partition by category_id)                    sum_cate,
                count(DISTINCT sku_info.sku_id) over (partition by category_id) num_cate
         from sku_info
              inner join order_detail on sku_info.sku_id = order_detail.sku_id
         ) t1
GROUP by sku_id, name, sum_sku, sum_cate, num_cate
sku_idnamesum_numcate_avg_num
1xiaomi 10511546
10帐篷2995373
11烧烤架3205373
12遮阳伞206825373
2手机壳60441546
3apple 12361546
4xiaomi 13531546
5破壁机242194
6洗碗机32194
7热水壶252194
8微波炉253194
9自行车1945373

3 从第二步的结果中取出所需的数据

select *
from (
    select sku_id,
    name,
    sum_sku                          sum_num,
    cast(sum_cate / num_cate as int) cate_avg_num
    from (
        select sku_info.sku_id,
        name,
        category_id,
        sum(sku_num) over (partition by sku_info.sku_id)                sum_sku,
        sum(sku_num) over (partition by category_id)                    sum_cate,
        count(DISTINCT sku_info.sku_id) over (partition by category_id) num_cate
        from sku_info
        inner join order_detail on sku_info.sku_id = order_detail.sku_id
    ) t1
    GROUP by sku_id, name, sum_sku, sum_cate, num_cate
) t2
where sum_num > cate_avg_num;
sku_idnamesum_numcate_avg_num
12遮阳伞206825373
2手机壳60441546
5破壁机242194
7热水壶252194
8微波炉253194
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值