题解 | #国庆期间近7日日均取消订单量#
国庆期间近7日日均取消订单量
https://www.nowcoder.com/practice/2b330aa6cc994ec2a988704a078a0703
# 解法一
# with
# combineday as (
# select
# '2021-10-01' as date
# union
# select
# '2021-10-02'
# union
# select
# '2021-10-03'
# ), # 自行定义国庆前三日
# dataList as (
# select
# tb_get_car_record.uid,
# order_id,
# start_time,
# finish_time
# from
# tb_get_car_record
# join tb_get_car_order using (order_id)
# ) #根据order_id将tb_get_car_record,tb_get_car_order进行连接
# select
# date,
# round(count(start_time)/7,2),#已完成的订单总量
# round(sum(if(start_time is null ,1 ,0))/7,2)#取消订单量
# from
# combineday,
# dataList
# where
# datediff (date, date(finish_time)) between 0 and 6
# group by date
#解法二:瑕疵在于你得确保9月份的25-30日均有数据
select
*
from (
select
groupdate,
round(sum(daynum)over(order by groupdate rows 6 preceding)/7,2) finish_num_7d, #根据每天的聚合日期求出7天内的订单总数,
round(sum(daycancelnum)over(order by groupdate rows 6 preceding)/7,2)cancel_num_7d # 根据每天的聚合日期求出7天内的取消订单总数
from
(
select
date(finish_time) as groupdate ,
sum(case when start_time is null then 0 else 1 end ) as daynum,#求出每天的完成订单量
sum(case when start_time is null then 1 else 0 end) as daycancelnum#求出每天取消的订单量
from
tb_get_car_record join tb_get_car_order
using(order_id)
group by
date(finish_time)
)t1
) t2
where
groupdate between '2021-10-01' and '2021-10-03'
本题有两种解法,
解法一:自定义一个国庆前三天的数据表,与复合表进行连接,判定条件是datediff(最后日期,开始日期)<=6,再根据已有的国庆三天的数据聚合,就可以得出数据。
解法二:根据复合表通过order_id 进行一个连接,然后根据finish_time进行聚合,先求出每天订单量和取消订单量,在通过窗口函数求出7天综合的单量和取消订单量 (rows 6 preceding),但是日期的筛选条件不能放到子查询里面,因为如果在子查询内限制了日期会影响窗口函数的求和计算。
查看16道真题和解析

