题解 | 统计骑手信息

统计骑手信息

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

with
    orders_encoder as (
        select
            order_id,
            courier_id,
            zone_id,
            order_time,
            delivered_time,
            status,
            TIMESTAMPDIFF(MINUTE, order_time, delivered_time) as spend_time,
            case
                when date_format(order_time, '%Y-%m') = '2023-02' then 1
                else 0
            end as 2023_02,
            case
                when date_format(order_time, '%Y-%m') = '2024-02' then 1
                else 0
            end as 2024_02,
            case
                when date_format(order_time, '%Y-%m') = '2024-01' then 1
                else 0
            end as 2024_01
        from
            Orders
        where
            status = 'delivered'
            AND HOUR(order_time) BETWEEN 11 AND 13
            OR hour(order_time) BETWEEN 18 AND 20
    ),
    peak_delivered as (
        select
            z.zone_id,
            z.zone_name,
            sum(oe.2023_02) as peak_2023_02_delivered,
            sum(oe.2024_02) as peak_2024_02_delivered,
            sum(oe.2024_01) as peak_2024_01_delivered,
            sum(oe.2024_02) - sum(oe.2023_02) as yoy_delta,
            sum(oe.2024_02) - sum(oe.2024_01) as mom_delta
        from
            orders_encoder oe
            left join Zones z on oe.zone_id = z.zone_id
        where
            date_format(oe.order_time, '%Y-%m') = '2023-02'
            or date_format(oe.order_time, '%Y-%m') = '2024-02'
            or date_format(oe.order_time, '%Y-%m') = '2024-01'
        group by
            z.zone_id,
            z.zone_name
    ),
    avg_time as (
        select
            z.zone_id,
            z.zone_name,
            round(avg(oe.spend_time), 2) as avg_peak_minutes_2024_02
        from
            orders_encoder oe
            left join Zones z on oe.zone_id = z.zone_id
        where
            date_format(oe.order_time, '%Y-%m') = '2024-02'
        group by
            z.zone_id,
            z.zone_name
    ),
    max_courier as (
        select
            zone_id,
            zone_name,
            courier_name as top_courier_2024_02
        from
            (
                select
                    zone_id,
                    zone_name,
                    courier_name,
                    dense_rank() over (
                        partition by
                            zone_id
                        order by
                            cnt_takeaway desc,
                            courier_id
                    ) as ranks
                from
                    (
                        select
                            z.zone_id,
                            z.zone_name,
                            c.courier_name,
                            c.courier_id,
                            count(oe.order_id) as cnt_takeaway
                        from
                            orders_encoder oe
                            left join Zones z on oe.zone_id = z.zone_id
                            left join Couriers c on oe.courier_id = c.courier_id
                        where
                            date_format(oe.order_time, '%Y-%m') = '2024-02'
                        group by
                            z.zone_id,
                            z.zone_name,
                            c.courier_name,
                            c.courier_id
                    ) tb1
            ) tb2
        where
            ranks = 1
    )
select 
    peak_delivered.zone_id,
    peak_delivered.zone_name,
    peak_delivered.peak_2023_02_delivered,
    peak_delivered.peak_2024_02_delivered,
    peak_delivered.peak_2024_01_delivered,
    peak_delivered.yoy_delta,
    peak_delivered.mom_delta,
    avg_time.avg_peak_minutes_2024_02,
    max_courier.top_courier_2024_02
from 
    peak_delivered
    join avg_time on peak_delivered.zone_id = avg_time.zone_id
    join max_courier on peak_delivered.zone_id = max_courier.zone_id

感觉代码过于冗余了,请求大佬指点

全部评论

相关推荐

在打卡的大老虎很想潜...:你在找实习,没啥实习经历,技术栈放前面,项目多就分两页写,太紧凑了,项目你最多写两个,讲清楚就行,项目背景。用到的技术栈、亮点、难点如何解决,人工智能进面太难了,需求少。你可以加最新大模型的东西
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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