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
无