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

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

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

题目要求

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

1、这个用户的user_id

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

3、满足前面条件的所有日期里购买成功的C++课程或Java课程或Python课程的次数cnt,

并且输出结果按照user_id升序排序

刚开始审错题了,搞复杂了反而通不过。一定要认真审题!!!!

思路

select 
    user_id, 
    first_buy_date,  # 从子查询里的「订单id」,筛出min(date)的一行
    cnt # 统计 count(查询里的「订单id) 
from
(
    # 这个表需要:符合条件的user_id + 这个用户在 这些特定条件下的 订单信息
)
where  count(2025-10-15以后,下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程 的用户数量) >= 1  # 这个子查询还需要输出user_id, 这个条件下他的订单id
# 只要from的表有数据,这条直接成立,所以在实际代码中不用写
order by user_id

分步骤思路:

  1. 查询出:符合条件的用户user_id
  2. 查询出:这些符合条件的用户user_id 在特定条件下的订单信息
  3. 从2得出的表里,select 对应项

正确代码

select 
    distinct a.user_id,
    min(a.date) as first_buy_date,
    count(distinct a.id) as cnt
from
(
    # 符合条件的用户user_id 在满足该条件时的所有订单id 及其信息
    select *
    from order_info
    where user_id in (

        # 符合条件的用户user_id
        select 
            distinct o.user_id
        from order_info o
            left join (
                # 所有用户use_id、符合条件下的 订单数量
                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
group by a.user_id

全部评论

相关推荐

Volatiled:对方撤回了啥呀?
点赞 评论 收藏
分享
双非阴暗爬行:我来看看笑死我了,这名字取得好想笑(没有不好的意思)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务