栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

牛客网-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)

查询结果如下:

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
总结

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/865595.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号