题解 | #牛客的课程订单分析(五)#

牛客的课程订单分析(五)

https://www.nowcoder.com/practice/348afda488554ceb922efd2f3effc427

题目要求

在2025-10-15以后,如果有一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程,那么输出

1、这个用户的user_id

2、这个用户满足前面条件的第一次购买成功的C++课程或Java课程或Python课程的日期first_buy_date

3、这个用户满足前面条件的第二次购买成功的C++课程或Java课程或Python课程的日期second_buy_date

4、这个用户(满足前面条件)购买成功的C++课程或Java课程或Python课程的次数cnt

输出结果按照user_id升序排序

思路

select 
    user_id,
    first_buy_date, # min(date)
    second_buy_date, # 窗口函数 升序 rank=2
    cnt # count(id)
from 符合条件的用户user_id,及他在特定条件下的 order_info
order by user_id asc

正确代码

按照上面的框架,很快写出来了 ,但是语法问题调试了好久,代码一多就容易出错...

select
    distinct a.user_id,
    min(a.date) as first_buy_date,
    b.date as second_buy_date,
    count(distinct a.id) as cnt
from (
    # 满足条件的user_id 及其在特定条件下的 订单信息
    select *
    from order_info
    where user_id in (
        # 特定条件下的订单数>=2的用户user_id
        select
            distinct o.user_id
        from order_info o
            left join 
            (
                # 所有用户及其 特定条件下的订单数
                select 
                    distinct user_id,
                    count(id)over(partition by user_id) as order_num
                from order_info
                where date > '2025-10-15'
                    and status = 'completed'
                    and product_name in ('C++','Java','Python')
            )n on o.user_id = n.user_id
        where n.order_num >= 2
    )
    and date > '2025-10-15'
    and status = 'completed'
    and product_name in ('C++','Java','Python')

)a

left join 
(
    select 
        b1.user_id,
        b1.date
    from (
        # 符合条件的用户user_id 及其特定条件下的order_info,及日期排序
        select *,
            row_number()over(partition by user_id order by date asc) as t_rank
        from order_info
        where user_id in (
            # 特定条件下的订单数>=2的用户user_id
            select
                distinct o1.user_id
            from order_info o1
                left join 
                (
                    # 所有用户及其 特定条件下的订单数
                    select 
                        distinct user_id,
                        count(id)over(partition by user_id) as order_num
                    from order_info
                    where date > '2025-10-15'
                        and status = 'completed'
                        and product_name in ('C++','Java','Python')
                )n1 on o1.user_id = n1.user_id
            where n1.order_num >= 2
        )
        and date > '2025-10-15'
        and status = 'completed'
        and product_name in ('C++','Java','Python')
    )b1
    where b1.t_rank = 2
    
)b
on a.user_id = b.user_id
group by a.user_id,b.date
order by a.user_id asc

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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