题解 | #国庆期间近7日日均取消订单量#
国庆期间近7日日均取消订单量
https://www.nowcoder.com/practice/2b330aa6cc994ec2a988704a078a0703
题目主要是考察连接on条件的运用
需要注意的是,题目本身考虑的是订单的取消,所以实际上根本用不到用户订车记录
所以司机接单之前的取消不算在内(如果考虑了乘客在接单前取消订单,会导致有一个用例不一致)
with tb_log as
(
select
date(end_time) order_dt,
isnull(start_time) or null 'if_cancel'
-- 如果要考虑乘客在司机接单前取消的情况,只需要把这里的left join替换成right即可
from tb_get_car_order
left join tb_get_car_record using (order_id)
)
select dt,
round((count(1) - sum(if_cancel)) / 7, 2) finish_num_7d,
round(sum(if_cancel) / 7, 2) cancel_num_7d
from tb_log
right join
(
select distinct order_dt dt from tb_log where order_dt between '2021-10-01' and '2021-10-03'
) tb_dt on order_dt between date_sub(dt, interval 6 day ) and dt
group by dt
order by dt;
当然了还有更简单的题解方式
select dt,
round((count(1) - sum(if_cancel)) / 7, 2) finish_num_7d,
round(sum(if_cancel) / 7, 2) cancel_num_7d
from
(
select distinct date(order_time) dt
from tb_get_car_order
where order_dt between '2021-10-01' and '2021-10-03'
) tb_dt
left join
(
select date(order_time) order_dt,
isnull(start_time) or null 'if_cancel'
from tb_get_car_order
) tb_log
on order_dt between date_sub(dt, interval 6 day ) and dt
group by dt
order by dt;

