题解 | #考试分数(五)#

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

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

本题思路:

  1. 找出2025-10-15后购买"C++", "Java", "Python"课程且完成订单的用户信息,通过窗口函数计算出,每个用户购买的记录流水
        select
          user_id,
          date,
          ROW_NUMBER() over (
            partition by user_id
            order by
              date asc
          ) as num
        from
          order_info
        where
          product_name in ("C++", "Java", "Python")
          AND date > '2025-10-15'
          AND status = 'completed'
  1. 在1的基础上取出第一二次购买的课程记录流水
    select
      a.user_id as user_id,
      min(a.date) as first_buy_date,
      max(a.date) as second_buy_date,
      count(*) as num
    from
      (
        select
          user_id,
          date,
          ROW_NUMBER() over (
            partition by user_id
            order by
              date asc
          ) as num
        from
          order_info
        where
          product_name in ("C++", "Java", "Python")
          AND date > '2025-10-15'
          AND status = 'completed'
      ) a
    where
      a.num <= 2
    group by
      user_id
  1. 聚合出每个用户的购买的记录数
    select
      user_id,
      count(*) as cnt
    from
      order_info
    where
      product_name in ("C++", "Java", "Python")
      AND date > '2025-10-15'
      AND status = 'completed'
    group by
      user_id
  1. join2和3中的表,取出2中记录数大于等于2的,并按照user_id升序,完整代码
select
  a.user_id as user_id,
  a.first_buy_date as first_buy_date,
  a.second_buy_date as second_buy_date,
  b.cnt as cnt
from
  (
    select
      a.user_id as user_id,
      min(a.date) as first_buy_date,
      max(a.date) as second_buy_date,
      count(*) as num
    from
      (
        select
          user_id,
          date,
          ROW_NUMBER() over (
            partition by user_id
            order by
              date asc
          ) as num
        from
          order_info
        where
          product_name in ("C++", "Java", "Python")
          AND date > '2025-10-15'
          AND status = 'completed'
      ) a
    where
      a.num <= 2
    group by
      user_id
  ) a
  left join (
    select
      user_id,
      count(*) as cnt
    from
      order_info
    where
      product_name in ("C++", "Java", "Python")
      AND date > '2025-10-15'
      AND status = 'completed'
    group by
      user_id
  ) b on a.user_id = b.user_id
  and a.num >= 2
where
  b.cnt is not null
order by
  user_id;
全部评论

相关推荐

06-26 18:30
门头沟学院 Java
据说名字越长别人越关注你的昵称我觉得我要被关注了:你问问这里面有多少是正经候选人,而不是乱打招呼的
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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