首先理清问题:请统计各个城市在2021年10月期间,单日中最大的同时等车人数
在开始做的时候我有一个误区,我把等待时间以为是用户打车记录表tb_get_car_record中的end_time-event_time,所以算出来的单日中最大的同时等车人数是3,跟结果不对;
最后发现等待时间其实是开始计费的上车时间start_time-打车时间end_time
好了我们已经知道已经如何计算了,那么我们就开始计算单日中每个时刻的等车人数了,
1、首先在用户打车记录表tb_get_car_record中将,每个城市每个时刻打车的人数,计算出来代码如下
select city, event_time dt,'1' as diff from tb_get_car_record where date_format(event_time,'%Y-%m')='2021-10')2、联立用户打车记录表tb_get_car_record和打车订单表tb_get_car_order,将每个城市每个时刻已经打到车的人数,计算出来
select city, start_time dt,'-1' as diff from tb_get_car_record t1 join tb_get_car_order t2 on t1.order_id=t2.order_id where date_format(start_time,'%Y-%m')='2021-10'3、联立以上两表,用sum()窗口函数,求出每个时刻的人数累计值,(注意题目要求如果同一时刻有人停止等车,有人开始等车,等车人数记作先增加后减少)所以order by diff desc要降序
select city, date(a.dt) dt, sum(diff) over(partition by city,date(a.dt) order by a.dt asc,diff desc) as uv from ((select city, event_time dt,'1' as diff from tb_get_car_record where date_format(event_time,'%Y-%m')='2021-10') union all (select city, start_time dt,'-1' as diff from tb_get_car_record t1 join tb_get_car_order t2 on t1.order_id=t2.order_id where date_format(start_time,'%Y-%m')='2021-10')) a4、这个时候我们已经得到每个城市每一天每个时刻的人数,用group by 函数求出每个城市,每一天的最大值即可,不知道,为啥我这里的sum计数有三位小数,用round()不行,所以就取巧用了left那位大神能知道跟我讲解下,全部代码如下;
select city,left(max(uv),1) muv from (select city, date(a.dt) dt, sum(diff) over(partition by city,date(a.dt) order by a.dt asc,diff desc) as uv from ((select city, event_time dt,'1' as diff from tb_get_car_record where date_format(event_time,'%Y-%m')='2021-10') union all (select city, start_time dt,'-1' as diff from tb_get_car_record t1 join tb_get_car_order t2 on t1.order_id=t2.order_id where date_format(start_time,'%Y-%m')='2021-10')) a ) b group by city,b.dt order by muv,city;