【Mysql】题解 | #牛客的课程订单分析(五)#---行转列搞定

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

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

题目描述:sql语句查询在2025-10-15以后,如果有一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程,那么输出这个用户的user_id,以及满足前面条件的第一次购买成功的C++课程或Java课程或Python课程的日期first_buy_date,以及满足前面条件的第二次购买成功的C++课程或Java课程或Python课程的日期second_buy_date,以及购买成功的C++课程或Java课程或Python课程的次数cnt,并且输出结果按照user_id升序排序。

步骤一:先找出除订单数大于等于2条件外,符合其他条件的结果。添加每个用户的订单量和按日期升序排序号

select *,
    count(id) over(partition by user_id) as cnt,
    row_number() over(partition by user_id order by date) as t_rank
from order_info
where datediff(date,"2025-10-15")>0
  and status = "completed"
  and product_name in ("C++","Java","Python")

步骤二:按照排序号可知1为首次支付日,2为第二次支付日。还需要筛选出订单量>=2的结果。并且用聚合函数可以实现行转列 ( 这里min()或max()都可以)。

with re as
(
    select *,
       count(id) over(partition by user_id) as cnt,
       row_number() over(partition by user_id order by date) as t_rank
    from order_info
    where datediff(date,"2025-10-15")>0
     and status = "completed"
     and product_name in ("C++","Java","Python")
)

select user_id,
    min((case when t_rank=1 then date end))as first_buy_date,
    min((case when t_rank=2 then date end)) as second_buy_date,
    cnt
from re 
where cnt>1
group by user_id
牛客题霸-SQL篇【Mysql】 文章被收录于专栏

少壮不努力,老大勤刷题

全部评论
group by 漏了cnt
2
送花
回复
分享
发布于 2022-03-15 14:07
如果用row_number()排名的话,如果在第一天买了两个课程的情况怎么办?
点赞
送花
回复
分享
发布于 2021-12-16 14:56
滴滴
校招火热招聘中
官网直投
最后应该再加一句oder by user_id吧
点赞
送花
回复
分享
发布于 2021-12-16 14:58

相关推荐

15 3 评论
分享
牛客网
牛客企业服务