因为数据是比较干净的,按日期升序,且中间没有缺失天数。故可使用窗口函数一步到位(偷懒了)

取固定窗口大小的数据进行统计用的也比较少,特此记录一下:

rows between 6 preceding and current row

select *
from (
    select date(co.finish_time) as dt,
        round(avg(count(co.fare)) over(rows 6 preceding), 2) as finish_num_7d,
        round(avg(sum(if(co.fare is null, 1, 0))) over(rows 6 preceding), 2) as cancel_num_7d
    from tb_get_car_order co
    group by date(co.finish_time)
) t1
where t1.dt between '2021-10-01' and '2021-10-03'

当然还有另一个方法,通过表的自连接

# 如下,算出9月25到10月3日每一天的接单量和未成单量
with temp as (
	select date(order_time) as dt,
		count(fare) as finish_order,
		sum(if(start_time is null, 1, 0)) as unfinish_order
	from tb_get_car_order
	where date(order_time) between '2021-09-25' and '2021-10-03'
	group by dt
)

# 在此基础上,使用表的自连接, 此处巧妙在于,连接产生笛卡尔积。而将笛卡尔积通过时间条件限制在仅产生7天的笛卡尔积,在根据时间进行分组即可得到结果
select t1.dt as dt,
	t2.dt as dt2,
	t2.finish_order as finish_order,
    t2.unfinish_order as unfinish_order
from temp as t1
join temp as t2 on t2.dt >= date_sub(t1.dt, interval 6 day) and t2.dt <= t1.dt
where t1.dt between '2021-10-01' and '2021-10-03'