题解 | #牛客的课程订单分析(五)#
牛客的课程订单分析(五)
https://www.nowcoder.com/practice/348afda488554ceb922efd2f3effc427
题目要求
在2025-10-15以后,如果有一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程,那么输出
1、这个用户的user_id
2、这个用户满足前面条件的第一次购买成功的C++课程或Java课程或Python课程的日期first_buy_date
3、这个用户满足前面条件的第二次购买成功的C++课程或Java课程或Python课程的日期second_buy_date
4、这个用户(满足前面条件)购买成功的C++课程或Java课程或Python课程的次数cnt
输出结果按照user_id升序排序
思路
select
user_id,
first_buy_date, # min(date)
second_buy_date, # 窗口函数 升序 rank=2
cnt # count(id)
from 符合条件的用户user_id,及他在特定条件下的 order_info
order by user_id asc
正确代码
按照上面的框架,很快写出来了 ,但是语法问题调试了好久,代码一多就容易出错...
select
distinct a.user_id,
min(a.date) as first_buy_date,
b.date as second_buy_date,
count(distinct a.id) as cnt
from (
# 满足条件的user_id 及其在特定条件下的 订单信息
select *
from order_info
where user_id in (
# 特定条件下的订单数>=2的用户user_id
select
distinct o.user_id
from order_info o
left join
(
# 所有用户及其 特定条件下的订单数
select
distinct user_id,
count(id)over(partition by user_id) as order_num
from order_info
where date > '2025-10-15'
and status = 'completed'
and product_name in ('C++','Java','Python')
)n on o.user_id = n.user_id
where n.order_num >= 2
)
and date > '2025-10-15'
and status = 'completed'
and product_name in ('C++','Java','Python')
)a
left join
(
select
b1.user_id,
b1.date
from (
# 符合条件的用户user_id 及其特定条件下的order_info,及日期排序
select *,
row_number()over(partition by user_id order by date asc) as t_rank
from order_info
where user_id in (
# 特定条件下的订单数>=2的用户user_id
select
distinct o1.user_id
from order_info o1
left join
(
# 所有用户及其 特定条件下的订单数
select
distinct user_id,
count(id)over(partition by user_id) as order_num
from order_info
where date > '2025-10-15'
and status = 'completed'
and product_name in ('C++','Java','Python')
)n1 on o1.user_id = n1.user_id
where n1.order_num >= 2
)
and date > '2025-10-15'
and status = 'completed'
and product_name in ('C++','Java','Python')
)b1
where b1.t_rank = 2
)b
on a.user_id = b.user_id
group by a.user_id,b.date
order by a.user_id asc

