HiveSQL 面试题 -计算即时订单比例

1 需求

  • 即时订单和计划订单

订单配送中,如果期望配送日期和下单日期相同,称为即时订单,如果期望配送日期和下单日期不同,称为计划订单。

请从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,保留两位小数,以小数形式显示。

  • 配送信息表 delivery_info
delivery_id (运单 *id*order_id (订单id)user_id (用户 id )order_date (下单日期)custom_date (期望配送日期)
111012021-09-272021-09-29
221012021-09-282021-09-28
331012021-09-292021-09-30
  • 期望结果
percentage <decimal(16,2)>
0.50

2 实现

  • 思路

请从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,保留两位小数,以小数形式显示。

首先需要从数据集中拿出每个用户的首单,一般都是使用排序开窗函数进行操作。然后计算即时订单的比例,只需要从拿出的首单数据中分别计算两个指标,再相除即可,注意需求中需要保留两位小数,所以可以使用 decimal 类型来展示最终的结果。

  • 实现

1 使用开窗函数获取每一个用户的首单数据

select * from (
	select user_id,order_date,custom_date,
		row_number() over(partition by user_id order by order_date) rn
	from delivery_info
) t1 where rn=1
user_idorder_datecustom_datern
1012021-09-272021-09-291
10102021-10-082021-10-101
1022021-10-012021-10-011
1032021-10-022021-10-031
1042021-10-032021-10-041
1052021-10-042021-10-041
1062021-10-042021-10-041
1072021-10-052021-10-051
1082021-10-062021-10-061
1092021-10-072021-10-081

2 直接在结果 1 的基础上进行指标的统计和结果的输出即可,需要将结果转换为 decimal(10,2) 展示

select 
	cast(round(sum(if(order_date = custom_date, 1, 0)) / count(1), 2) 
         as decimal(10,2)) percentage
from (
	select user_id,order_date,custom_date,
		row_number() over(partition by user_id order by order_date) rn
	from delivery_info
) t1 where rn=1
percentage <decimal(16,2)>
0.50
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值