题解 | #牛客的课程订单分析(四)#
牛客的课程订单分析(四)
https://www.nowcoder.com/practice/c93d2079282f4943a3771ca6fd081c23
题目要求
查询在2025-10-15以后,如果有一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程,那么输出
1、这个用户的user_id
2、满足前面条件的第一次购买成功的C++课程或Java课程或Python课程的日期first_buy_date
3、满足前面条件的所有日期里购买成功的C++课程或Java课程或Python课程的次数cnt,
并且输出结果按照user_id升序排序
刚开始审错题了,搞复杂了反而通不过。一定要认真审题!!!!
思路
select
user_id,
first_buy_date, # 从子查询里的「订单id」,筛出min(date)的一行
cnt # 统计 count(查询里的「订单id)
from
(
# 这个表需要:符合条件的user_id + 这个用户在 这些特定条件下的 订单信息
)
where count(2025-10-15以后,下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程 的用户数量) >= 1 # 这个子查询还需要输出user_id, 这个条件下他的订单id
# 只要from的表有数据,这条直接成立,所以在实际代码中不用写
order by user_id
分步骤思路:
- 查询出:符合条件的用户user_id
- 查询出:这些符合条件的用户user_id 在特定条件下的订单信息
- 从2得出的表里,select 对应项
正确代码
select
distinct a.user_id,
min(a.date) as first_buy_date,
count(distinct a.id) as cnt
from
(
# 符合条件的用户user_id 在满足该条件时的所有订单id 及其信息
select *
from order_info
where user_id in (
# 符合条件的用户user_id
select
distinct o.user_id
from order_info o
left join (
# 所有用户use_id、符合条件下的 订单数量
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
group by a.user_id
