1.题目需求:
查询订单明细表(order_detail)中销量(下单件数)排名第二的商品id,如果不存在返回null,如果存在多个排名第二的商品则需要全部返回。
2.所查询表创建/数据导入
--订单信息表
create table order_info
(
`order_id` string COMMENT '订单id',
`user_id` string COMMENT '用户id',
`create_date` string COMMENT '下单日期',
`total_amount` decimal(16, 2) COMMENT '订单总金额'
) COMMENT '订单表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
--数据装载
insert overwrite table order_info
values ('1', '101', '2021-09-27', 29000.00),
('2', '101', '2021-09-28', 70500.00),
('3', '101', '2021-09-29', 43300.00),
('4', '101', '2021-09-30', 860.00),
('5', '102', '2021-10-01', 46180.00),
('6', '102', '2021-10-01', 50000.00),
('7', '102', '2021-10-01', 75500.00),
('8', '102', '2021-10-02', 6170.00),
('9', '103', '2021-10-02', 18580.00),
('10', '103', '2021-10-02', 28000.00),
('11', '103', '2021-10-02', 23400.00),
('12', '103', '2021-10-03', 5910.00),
('13', '104', '2021-10-03', 13000.00),
('14', '104', '2021-10-03', 69500.00),
('15', '104', '2021-10-03', 2000.00),
('16', '104', '2021-10-03', 5380.00),
('17', '105', '2021-10-04', 6210.00),
('18', '105', '2021-10-04', 68000.00),
('19', '105', '2021-10-04', 43100.00),
('20', '105', '2021-10-04', 2790.00),
('21', '106', '2021-10-04', 9390.00),
('22', '106', '2021-10-05', 58000.00),
('23', '106', '2021-10-05', 46600.00),
('24', '106', '2021-10-05', 5160.00),
('25', '107', '2021-10-05', 55350.00),
('26', '107', '2021-10-05', 14500.00),
('27', '107', '2021-10-06', 47400.00),
('28', '107', '2021-10-06', 6900.00),
('29', '108', '2021-10-06', 56570.00),
('30', '108', '2021-10-06', 44500.00),
('31', '108', '2021-10-07', 50800.00),
('32', '108', '2021-10-07', 3900.00),
('33', '109', '2021-10-07', 41480.00),
('34', '109', '2021-10-07', 88000.00),
('35', '109', '2020-10-08', 15000.00),
('36', '109', '2020-10-08', 9020.00),
('37', '1010', '2020-10-08', 9260.00),
('38', '1010', '2020-10-08', 12000.00),
('39', '1010', '2020-10-08', 23900.00),
('40', '1010', '2020-10-08', 6790.00);
3.表数据预览
4.答案
4.1第一步:求出每个商品的总的下单件数,并进行一个dense_rank()开窗排名
select sku_id,
dense_rank() over (order by sum(sku_num) desc) as dense_rank
from order_detail
group by sku_id;
这里为什么用dense_rank()开窗,rank()、dense_rank、row_number()三者的区别
rank()开窗:同样的值会给同一个排名,排名存在间断
dense_rank()开窗:同样的值会给同一个排名,排名不会存在间断
row_number()开窗:同样的值不会给用一个排名(按照顺序往下排),排名不会存在间断
具体如下图:

4.2筛选出排名为2的商品id,如果不存在第2名,补为null值
select nvl(sku_id, null) sku_id
from (select sku_id,
dense_rank() over (order by sum(sku_num) desc) as dense_rank
from order_detail
group by sku_id) t1
where dense_rank = 2;
nvl函数: nvl(参数1,参数2)
意思是如果第一个参数不为null,那么将会以第1个参数作为输出,如果第一个参数为null将会以第2个参数作为输出
当然这里我们也可以用if()进行判断
if(sku_id is null,null,sku_id) sku_id
后续每周不定时更新日常hivesql的练习题,创作不易,点个赞吧!
文章描述了如何使用HiveSQL查询订单明细表order_detail,计算每个商品的下单件数并按销量排名,然后找出销量排名第二的商品ID,若不存在则返回null。文中还解释了dense_rank()与其他窗口函数的区别。


2706

被折叠的 条评论
为什么被折叠?



