题解 | 找出补位班次

找出补位班次

https://www.nowcoder.com/practice/ed828b0385a84e0db95f1513f43076d4

with t as
(
    select shift_id,store_id,shift_date,shift_period,required_rider_count,published_at 
    from relief_shifts 
    where shift_date between '2025-08-15' and '2025-08-17' 
      and shift_status = 'filled'
),
-- 先找出每个班次+骑手的最早邀约记录
first_invites as
(
    select shift_id, rider_id, invited_at, responded_at, response_status
    from shift_invite_responses s1
    where invited_at in (
        select min(invited_at) 
        from shift_invite_responses  
        group by shift_id,rider_id
    )
),
t1 as
(
    select s.shift_id, 
           t.required_rider_count,
           count(distinct s.rider_id) as accepted_in_2h_rider_count,
           t.published_at 
    from first_invites s 
    join t on s.shift_id = t.shift_id
    where timestampdiff(second, s.invited_at, s.responded_at) <= 7200
      and s.response_status = 'accepted'
    group by s.shift_id
),
t2 as
(
    select store_id,shift_date,t1.shift_id,shift_period,
           t1.required_rider_count,
           coalesce(accepted_in_2h_rider_count, 0) as accepted_in_2h_rider_count,
           round(coalesce(accepted_in_2h_rider_count, 0) / t1.required_rider_count, 2) as acceptance_rate,
           t1.published_at 
    from t 
    left join t1 on t.shift_id = t1.shift_id
)
select store_id,shift_date,shift_id,shift_period,
       required_rider_count,accepted_in_2h_rider_count,acceptance_rate 
from 
(
    select store_id,shift_date,shift_id,shift_period,
           required_rider_count,accepted_in_2h_rider_count,acceptance_rate,
           rank() over(
               partition by store_id,shift_date 
               order by acceptance_rate desc,
                        accepted_in_2h_rider_count desc,
                        published_at asc,
                        shift_id asc
           ) as rk 
    from t2
) tt 
where rk = 1;

全部评论

相关推荐

03-03 19:02
已编辑
东华理工大学 Node.js
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务