题解 | #国庆期间近7日日均取消订单量#
国庆期间近7日日均取消订单量
https://www.nowcoder.com/practice/2b330aa6cc994ec2a988704a078a0703
一、解题思路
- 首先把用户打车记录表和打车订单表left join连接起来,用order_id等值连接;
- 用连接好的宽表,计算出每天的订单完成量和订单取消量,使用if()函数和sum函数嵌套即可,注意:日期以order_time字段为准(一开始使用event_time字段,提交时发现报错后改为了order_time),用date()函数将其转化为日期类型;
- 在上一步获得的临时表的基础上,计算出每天近7天的平均订单完成量和平均订单取消量,主要使用聚合窗口函数avg()over()的偏移聚合功能,注意:偏移量为6,计算结果保留2位小数;
- 在上一步获得的临时表的基础上,筛选出10/1~10/3期间的数据即可。
二、完整题解代码
with daily_order_cnt as (select date(order_time)event_date,sum(if(order_id is not null and fare is not null and mileage is not null,1,0))order_finish,sum(if(start_time is null,1,0))order_cancel from tb_get_car_record left join tb_get_car_order using(order_id) group by date(order_time) ), daily_rate as (select event_date,round(avg(order_finish)over(order by event_date rows between 6 preceding and current row),2)sum_finish_rate,round(avg(order_cancel)over(order by event_date rows between 6 preceding and current row),2)sum_cancel from daily_order_cnt ) select * from daily_rate where event_date between '2021-10-01' and '2021-10-03' order by event_date ;
三、提交结果截图
四、后记
本题解用了两次临时表,分了三步来实现,优点是思路简单清晰,缺点是代码较冗长,有优化空间。