题解 | #牛客的课程订单分析(四)#
牛客的课程订单分析(四)
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