首页 > 试题广场 >

牛客的课程订单分析(五)

[编程题]牛客的课程订单分析(五)
  • 热度指数:89575 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

有很多同学在牛客购买课程来学习,购买会产生订单存到数据库里

有一个订单信息表(order_info),简况如下:

id user_id product_name
status
client_id
date
1 557336
C++
no_completed
1 2025-10-10
2 230173543
Python
completed
2 2025-10-12
3 57 JS
completed
3 2025-10-23
4 57 C++
completed
3 2025-10-23
5 557336
Java
completed
1 2025-10-23
6 57 Java
completed
1 2025-10-24
7 557336
C++
completed
1 2025-10-25
8 557336
Python
completed
1 2025-10-26

1行表示user_id557336的用户在2025-10-10的时候使用了client_id1的客户端下了C++课程的订单,但是状态为没有购买成功。

2行表示user_id230173543的用户在2025-10-12的时候使用了client_id2的客户端下了Python课程的订单,状态为购买成功。

......

最后1行表示user_id557336的用户在2025-10-26的时候使用了client_id1的客户端下了Python课程的订单,状态为购买成功。


请你写出一个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升序排序,以上例子查询结果如下:

user_id first_buy_date second_buy_date cnt
57 2025-10-23 2025-10-24 2
557336 2025-10-23 2025-10-25
3

解析:

id为46的订单满足以上条件,输出57id为4的订单为第一次购买成功,输出first_buy_date为2025-10-23,id为6的订单为第二次购买,输出second_buy_date为2025-10-24,总共成功购买了2;

id为578的订单满足以上条件,输出557336id为5的订单为第一次购买成功,输出first_buy_date为2025-10-23,id为7的订单为第二次购买,输出second_buy_date为2025-10-25,总共成功购买了3;

示例1

输入

drop table if exists order_info;
CREATE TABLE order_info (
id int(4) NOT NULL,
user_id int(11) NOT NULL,
product_name varchar(256) NOT NULL,
status varchar(32) NOT NULL,
client_id int(4) NOT NULL,
date date NOT NULL,
PRIMARY KEY (id));

INSERT INTO order_info VALUES
(1,557336,'C++','no_completed',1,'2025-10-10'),
(2,230173543,'Python','completed',2,'2025-10-12'),
(3,57,'JS','completed',3,'2025-10-23'),
(4,57,'C++','completed',3,'2025-10-23'),
(5,557336,'Java','completed',1,'2025-10-23'),
(6,57,'Java','completed',1,'2025-10-24'),
(7,557336,'C++','completed',1,'2025-10-25'),
(8,557336,'Python','completed',1,'2025-10-26');

输出

57|2025-10-23|2025-10-24|2
557336|2025-10-23|2025-10-25|3
头像 一洛玉壶冰
发表于 2021-03-08 13:49:55
题目仅要求返回第1、2次购买时间,故只需返回前两条记录,时间最小为第1次,时间最大为第2次,购买次数可用开窗函数计算,代码如下: select a.user_id, min(a.date) as first_buy_date, max(a.date) as second_buy_date, 展开全文
头像 肖大神
发表于 2021-03-12 19:55:18
开窗函数row_number()分区中不重复不间断的序号lead(expr,n)分区中位于后n行的expr的值 select user_id, min(date) as first_buy_date, min(下一个日期) as second_buy_date, max(次数 展开全文
头像 SunburstRun
发表于 2021-02-26 16:49:30
根据https://blog.nowcoder.net/n/5687da9041664645ae2eee83ea02dc60可以写出: select user_id,min(date) as first_buy_date,count(user_id)  展开全文
头像 此用户名涉嫌违规
发表于 2021-04-16 16:54:12
题目描述:sql语句查询在2025-10-15以后,如果有一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程,那么输出这个用户的user_id,以及满足前面条件的第一次购买成功的C++课程或Java课程或Python课程的日期first_buy_date,以及满足 展开全文
头像 jiang_dr
发表于 2021-11-18 09:56:31
思路: 求second_buy_date的核心重点是:min(date > min(date)) 我们使用订单分析四中的结果,求出最小的date,然后联立 order_info 表,通过 t1.date > t2.first_buy_date 及 min(t1.date) 求出第二小da 展开全文
头像 万兵0610
发表于 2021-03-25 16:53:05
窗口函数和group by的区别 group by分组之后,统计默认只会计算一行记录 窗口函数 分组之后,有多少列显示多少行记录思路 1.首先过滤筛选不符合的记录,然后根据用户分组,计算出每组用户的排名和统计总数 select user_id, date, dense_ran 展开全文
头像 韭菜&文盲
发表于 2021-03-24 11:31:25
看了一下 俺的代码比较取巧select user_id,min(date),substr(group_concat(distinct(date)order by date ), 12, 10) ,count(user_id) cntfrom order_info where date>'202 展开全文
头像 高质量搬砖人
发表于 2021-04-02 14:55:24
新增限制条件 第二次购买成功的C++课程或Java课程或Python课程的日期second_buy_date 参考了友友的答案,where筛选max min 真的很妙但不太理解为什么要group by...希望有大神解释一下 TVT select a.user_id, min(date) as 展开全文
头像 Ding_123
发表于 2021-12-09 14:56:12
知识点 窗口函数表格和之前一样写,因为之后有日期可能同一天买不同的课所以这里使用dense_rank,然后把新表按照id进行排序 第一天第二天或者以此类推,使用case when,第一天就是r=1对应的日期没有符合条件的就是0,取结果的最大值 代码 select a.user_id, max( 展开全文
头像 被卷废的小张
发表于 2022-03-17 11:44:34
1、题目要求查出在 限制条件:(1)2025-10-15以后,(2)产品在('C++','Python','Java')中(3)状态为成功(4)同一个用户购买两次及以上 的 指标: (1)用户id(2)前两次购买的日期(3)总购买次数; 2、前三个条件好写,统一放到where筛选语句后 where 展开全文