题解 | 统计骑手信息

统计骑手信息

https://www.nowcoder.com/practice/704de2445ed943c6bf65cfd77bd69ff4

with
    tab as (
        # 统计同比、环比增量和平均运送时长
        select
            zone_id,
            zone_name,
            peak_2023_02_delivered,
            peak_2024_02_delivered,
            peak_2024_01_delivered,
            peak_2024_02_delivered - peak_2023_02_delivered as yoy_delta,
            peak_2024_02_delivered - peak_2024_01_delivered as mom_delta,
            round(total_minutes / peak_2024_02_delivered, 2) as avg_peak_minutes_2024_02
        from
            (
                select
                    zone_id,
                    zone_name,
                    # 2023-02 高峰时段已送达订单数
                    count(
                        case
                            when status = 'delivered'
                            and order_time like '2023-02%'
                            and (
                                HOUR(order_time) BETWEEN 11 AND 13
                                OR HOUR(order_time) BETWEEN 18 AND 20
                            ) then 1
                            else null
                        end
                    ) as peak_2023_02_delivered,
                    # 2024-02 高峰时段已送达订单数
                    count(
                        case
                            when status = 'delivered'
                            and order_time like '2024-02%'
                            and (
                                HOUR(order_time) BETWEEN 11 AND 13
                                OR HOUR(order_time) BETWEEN 18 AND 20
                            ) then 1
                            else null
                        end
                    ) as peak_2024_02_delivered,
                    # 2024-01 高峰时段已送达订单数
                    count(
                        case
                            when status = 'delivered'
                            and order_time like '2024-01%'
                            and (
                                HOUR(order_time) BETWEEN 11 AND 13
                                OR HOUR(order_time) BETWEEN 18 AND 20
                            ) then 1
                            else null
                        end
                    ) as peak_2024_01_delivered,
                    # 2024-02 高峰时段总运送分钟
                    sum(
                        case
                            when status = 'delivered'
                            and order_time like '2024-02%'
                            and (
                                HOUR(order_time) BETWEEN 11 AND 13
                                OR HOUR(order_time) BETWEEN 18 AND 20
                            ) then TIMESTAMPDIFF(MINUTE, order_time, delivered_time)
                        end
                    ) as total_minutes
                from
                    # 连接所有表
                    (
                        select
                            o.order_id,
                            o.courier_id,
                            c.courier_name,
                            o.zone_id,
                            z.zone_name,
                            o.order_time,
                            o.delivered_time,
                            o.status
                        from
                            Orders as o
                            left join Zones as z on o.zone_id = z.zone_id
                            left join Couriers as c on o.courier_id = c.courier_id
                    ) as temp
                group by
                    zone_id,
                    zone_name
            ) as temp2
    )
    # 连接with创建的临时表
select
    tab.zone_id,
    tab.zone_name,
    tab.peak_2023_02_delivered,
    tab.peak_2024_02_delivered,
    tab.peak_2024_01_delivered,
    tab.yoy_delta,
    tab.mom_delta,
    tab.avg_peak_minutes_2024_02,
    final.courier_name as top_courier_2024_02
from
    (
        # 筛选排名为1的骑手
        select
            zone_id,
            zone_name,
            courier_name
        from
            (
                # 降序计算排名
                select
                    zone_id,
                    zone_name,
                    courier_name,
                    row_number() over (
                        partition by
                            zone_id,
                            zone_name
                        order by
                            counting desc,
                            courier_id asc
                    ) as ranking
                from
                    (
                        # 按照地区id、地区名、骑手id分组统计配送次数,避免重名现象
                        select
                            zone_id,
                            zone_name,
                            courier_id,
                            courier_name,
                            count(
                                case
                                    when status = 'delivered'
                                    and order_time like '2024_02%'
                                    and (
                                        HOUR(order_time) BETWEEN 11 AND 13
                                        OR HOUR(order_time) BETWEEN 18 AND 20
                                    ) then 1
                                    else null
                                end
                            ) as counting
                        from
                            (
                                # 单独统计各2024_02高峰时段各商圈送达订单最多的骑手姓名,并列按Id升序
                                select
                                    o.order_id,
                                    o.courier_id,
                                    c.courier_name,
                                    o.zone_id,
                                    z.zone_name,
                                    o.order_time,
                                    o.delivered_time,
                                    o.status
                                from
                                    Orders as o
                                    left join Zones as z on o.zone_id = z.zone_id
                                    left join Couriers as c on o.courier_id = c.courier_id
                            ) as temp
                        group by
                            zone_id,
                            zone_name,
                            courier_id
                        order by
                            zone_id asc
                    ) as temp2
            ) as temp3
        where
            ranking <= 1
    ) as final
    inner join tab on final.zone_id = tab.zone_id

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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