题解 | #国庆期间近7日日均取消订单量#
国庆期间近7日日均取消订单量
https://www.nowcoder.com/practice/2b330aa6cc994ec2a988704a078a0703
#需求:统计国庆头3天里,每天的近7日日均订单完成量和日均订单取消量 #输出:日期、近7日日均订单完成量、日均订单取消量 #要求:输出时间范围为'2021-10-01'-'2021-10-03';求每个dt的近7日记录;输出保留2位小数,按dt升序 #拆分问题: #国庆头3天,每天的近7日数据:dt between '2021-09-25' and '2021-10-03'限定时间范围 #订单完成量:sum(if(start_time is null,0,1)) tt1 #订单取消量:count(1)-tt1 #近7日日均:开窗,avg(tt1)over(order by dt rows 6 preceding) 依据dt日期,从当前行至向前6行取值 #思路:先子查询,限制时间范围并求得dt、订单完成量、订单取消量,然后开窗得到日均,加上要求的条件,输出 with t1 as( select dt,sum(tt1) tt2,count(1)-sum(tt1) tt3 from( select date(order_time) dt,if(start_time is null,0,1) tt1 from tb_get_car_order where date(order_time) between '2021-09-25' and '2021-10-03' ) t2 group by dt ) #建立虚拟表,得到限制时间选区后的数据表,和每日的订单完成量和取消量 select dt,round(ck1,2) finish_num_7d,round(ck2,2) cancel_num_7d from( select dt,avg(tt2)over(order by dt rows 6 preceding) ck1, avg(tt3)over(order by dt rows 6 preceding) ck2 from t1 ) t3 #这里的加子查询的原因,要限制输出dt范围,而直接写在里面会影响ck1和ck2的运算,缩小了它的取值范围,结果不对 where dt>='2021-10-01'