HiveSQL 面试题 - 统计每种商品销售件数最多的日期以及当日销量

1 需求

从订单明细表(order_detail)中统计出每种商品销售件数最多的日期及当日销量,如果有同一商品多日销量并列的情况,取其中的最小日期。

  • 订单明细表 order_detail
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 (商品id)create_date (销量最高的日期)sum_num (销量)
12021-09-309
22021-10-025800
32021-10-059
42021-10-0710
52021-10-0347
62021-10-038
72021-10-0558
82020-10-0859
92021-10-0145
102020-10-0894
112020-10-0895
122021-10-0320400

2 解答

  • 思路

由于需要统计每一件商品的销售件数最多的日期,针对每一个 sku_id 进行统计,所以需要使用窗口函数对数据按照指定的队则进行排名,需要注意的时排名时需要进行倒序,并且相同的排名需要使用二级字段来确定先后。

  • 实现

1 按照商品 + 日期进行分组,统计每个商品在每一天的总销量

SELECT sku_id,
       create_date,
       sum(sku_num) sum_num
from order_detail
group by sku_id, create_date;
sku_idcreate_datesum_num
12020-10-082
12021-09-272
12021-10-018
12021-10-029
12021-10-034
12021-10-045
12021-10-055
12021-10-068
12021-10-078
102020-10-0894
102021-10-0248
102021-10-0369
102021-10-0527
102021-10-0637
102021-10-0724

2 在步骤 1 的基础上,开窗进行排名,注意排序函数中的 order by sum_num desc,create_date asc

SELECT sku_id,
       create_date,
       sum_num,
       row_number() over (partition by sku_id order by sum_num desc,create_date asc) rn
from (SELECT sku_id,
      		  create_date,
             sum(sku_num) sum_num
      from order_detail
      group by sku_id, create_date) t1;
sku_idcreate_datesum_numrn
12021-10-0291
12021-10-0182
12021-10-0683
12021-10-0784
12021-10-0455
12021-10-0556
12021-10-0347
12020-10-0828
12021-09-2729
102020-10-08941
102021-10-03692
102021-10-02483
102021-10-06374
102021-10-05275
102021-10-07246
112020-10-08951
112021-10-03612
112021-10-06463

3 生成排名之后,限制排名为 1 的记录即可得到结果

SELECT sku_id, create_date, sum_num
from (
         SELECT sku_id,
                create_date,
                sum_num,
                row_number() over (partition by sku_id order by sum_num desc,create_date asc) rn
         from (SELECT sku_id,
                      create_date,
                      sum(sku_num) sum_num
               from order_detail
               group by sku_id, create_date) t1
         ) t2
where rn = 1
order by sku_id, create_date, sum_num;
sku_idsum_numcreate_date
192021-10-02
258002021-10-02
392021-10-05
4102021-10-07
5472021-10-03
682021-10-03
7582021-10-05
8592020-10-08
9452021-10-01
10942020-10-08
11952020-10-08
12204002021-10-03
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值