通过代码

with t as (select
    event_time times,
    city,
    1 num
from
    tb_get_car_record
where substr(event_time,1,7) = '2021-10'
union all
select
    start_time times,
    city,
    -1 num
from
    tb_get_car_record
join
    tb_get_car_order
on
    tb_get_car_order.order_id = tb_get_car_record.order_id
where substr(event_time,1,7) = '2021-10')
select
    city,
    max(nums) max_wait_uv
from(select
    city,
    sum(num)over(ROWS UNBOUNDED PRECEDING) nums
from t
order by
    times) t1
group by
    city
order by
    max_wait_uv,city

思路:

问题:请统计各个城市2021年10月期间,单日中最大的同时等车人数。

注: 等车指从开始打车起,直到取消打车、取消等待或上车前的这段时间里用户的状态。

如果同一时刻有人停止等车,有人开始等车,等车人数记作先增加后减少。

结果按各城市最大等车人数升序排序,相同时按城市升序排序

我以为这题跟以前的一个每篇文章同一时刻最大在看人数

特别像所以信心满满就开始了

直接union + 聚合函数

首先把开始时间进行标记‘1’ 即 event_time

union all

把结束时间进行标记‘-1’ 即start_time

select
    event_time times,
    city,
    1 num
from
    tb_get_car_record
where substr(event_time,1,7) = '2021-10'
union all
select
    start_time times,
    city,
    -1 num
from
    tb_get_car_record
join
    tb_get_car_order
on
    tb_get_car_order.order_id = tb_get_car_record.order_id
where substr(event_time,1,7) = '2021-10'

最后窗口聚合函数求和:按照时间排序,和就是当时在等的人数

select
    city,
    max(nums) max_wait_uv
from(select
    city,
    sum(num)over(partition by city order by times) nums
from t
order by
    times) t1
group by
    city
order by
    max_wait_uv,city

这样,对吗?

问题1 sum()over()

alt

如果聚合函数order by time 就会出现这种情况 在同一时间有人开始等,有人坐上车,sum不会计算了,这里第一个箭头指向sum应该是6,这里却是5

所以这里我选择用窗口函数的第三个参数 ROWS国庆期间每类视频点赞量和转发量这里写过怎么用

先排序,然后sum计算第一行到当前行就行。


问题2 order by 执行顺序

在什么地方排序

我们可以在t里面排序 ,如果order by 在union上就是对上半个表排序 ,在下边就是对整个表排序

如果不在t里面排序呢?

在窗口函数那里排序行吗? 我觉得不行,实际上可以

截图alt

为什么呢?

不是先执行select 再执行 order by 吗? 难道是窗口函数特殊吗?

所以我用另一个试试

alt

nums的顺序乱了,说明先执行了 select 然后 order by

可是

alt

所以结论就是,使用ROWS会影响执行顺序,为什么呢? 我不知道。。。希望有知道的大佬跟小弟说说。反正就这么用了。


问题3 单日怎么办?

我这里不管单日这个限制,为什么呢? 因为每一天和为0

如果有人半夜打车,然后等车到第二天呢? 有影响吗?没有影响。

如果有人第一天半夜打车等到第三天呢? 我建议找开发,让他们修bug去。