牛客网-SQL篇-全部题目-困难-SQL81 牛客的课程订单分析(五)

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升序排序。

解题

1.问题拆解:先查询在2025-10-15以后,用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程,输出用户的user_id。代码如下:

select user_id,date,r,cnt 
from(
    select user_id, date,
           rank() over(partition by user_id order by date) r, 
	       count(user_id) over(partition by user_id) cnt
   from order_info
   where status='completed' 
   and product_name in ('C++','Java','Python')
   and date>'2025-10-15'
) as t 
where cnt>=2)

查询结果如下:
牛客网-SQL篇-全部题目-困难-SQL81 牛客的课程订单分析(五)_第1张图片
2.将r=1的日期设置为first_buy_date;r=2的日期设置为second_buy_date,两次日期用inner join连接,代码如下:

with m as(
  select user_id,date,r,cnt from(
    select user_id, date,
           rank() over(partition by user_id order by date) r, 
	       count(user_id) over(partition by user_id) cnt
    from order_info
    where status='completed' 
   and product_name in ('C++','Java','Python')
   and date>'2025-10-15'
 ) as t 
 where cnt>=2
 )

select * from(
	select user_id,date first_buy_date,cnt from m where r= 1) n1
inner join 
(select user_id user_id1,date second_buy_date,cnt cnt1 from m where r= 2) n2 
on n1.user_id=n2.user_id1 
and n1.cnt=n2.cnt1

查询结果如下:
在这里插入图片描述
3.这里只需要查询用户id,日期,总数,因此嵌套一个子查询,完整代码如下:

with m as(
    select user_id,date,r,cnt from(
        select user_id, date,
               rank() over(partition by user_id order by date) r, 
	           count(user_id) over(partition by user_id) cnt
       from order_info
       where status='completed' 
       and product_name in ('C++','Java','Python')
       and date>'2025-10-15'
    ) as t 
    where cnt>=2
)

select user_id,first_buy_date,second_buy_date,cnt 
from(
	select * from(
	select user_id,date first_buy_date,cnt from m where r= 1) n1
	inner join 
	(select user_id user_id1,date second_buy_date,cnt cnt1 from mwhere r= 2) n2 
	on n1.user_id=n2.user_id1 and n1.cnt=n2.cnt1
) as n3

最终查询结果,如下:
在这里插入图片描述
4.上述代码太复杂,这里引用大佬代码,供以后学习研究:

-- 地址:牛客网

select user_id,max(if(date_rk=1,date,null)),max(if(date_rk=2,date,null)),max(cnt) 
from(select user_id,date,rank() over(partition by user_id order by date) date_rk,count(1) over(partition by user_id) cnt
    from order_info
    where date>'2025-10-15' and product_name in ('C++','Java','Python') and status='completed') t1
where cnt>=2
group by user_id
order by user_id

总结

你可能感兴趣的:(牛客网-MySQL,mysql)