一、思路:要计算单日最大等车人数关键在于 选出等车人数发生变化的时刻去计算当时的人数,其他任一时刻等车人数都不会变化,不用管。 1、先按天分组,在每一天的分组里去计算每一个人数增减变化时刻的等车人数 (人数增减变化的时刻无非是:下单时刻、司机接单前取消时刻、司机接单后不上车的取消时刻、司机接单后上车时刻); 2、把这些订单状态变化的时刻打上标签,下单时刻会让人数增加记为1,其他三个时刻人数会减少记为-1,用union all联立后可以聚合运算; 二、步骤: ①先准备一张数据底表tb1方便取数(个人习惯):把两表连接,取出人数增减变化的时刻,下单时刻event_time记为1,终止等待的时刻记为-1,该列记为diff(这里用if判断一下什么时候用end_time,什么时候用finish_time或者start_time); ②从tb1中选出city、时刻、diff这三列,用union all联立,形成tb2; ③针对tb2用窗口函数sum()over()对±1那列进行逐行累加,这样每一个时刻对应的等车人数就计算出来了。这里注意over里要用城市+天分组、并用时刻正序+diff降序排列(题中说了同一时刻有进有出 记为 先进后出),此时形成tb3。 ④最后对tb3进行城市分组,选出最大值即可。 with tb1 as( select city, event_time, 1 as a, case when order_id is null then end_time when start_time is null then finish_time else start_time end as out_time, -1 as b from tb_get_car_record left join tb_get_car_order using(order_id) where date_format(event_time,'%Y%m')='202110') select city, max(wait_uv) as max_wait_uv from( select city, date(dt), dt, sum(diff)over(partition by city, date(dt) order by dt, diff desc) as wait_uv from( select city, event_time as dt, a as diff from tb1 union all select city, out_time as dt, b as diff from tb1 ) as tb2 ) as tb3 group by city order by max_wait_uv, city