题解 | #牛客的课程订单分析(五)#
牛客的课程订单分析(五)
https://www.nowcoder.com/practice/348afda488554ceb922efd2f3effc427
SELECT DISTINCT t3.user_id,t1.first_buy_date,t2.second_buy_date,t3.cnt
FROM(SELECT user_id,date as first_buy_date
FROM(SELECT user_id,date,
ROW_NUMBER()OVER(PARTITION BY user_id ORDER BY date) rk
FROM order_info
WHERE date > '2025-10-15'
and product_name in ('C++','Java','Python')
and status = 'completed'
) t
WHERE rk = 1
) t1
JOIN (
SELECT user_id,date as second_buy_date
FROM(SELECT user_id,date,
ROW_NUMBER()OVER(PARTITION BY user_id ORDER BY date) rk
FROM order_info
WHERE date > '2025-10-15'
and product_name in ('C++','Java','Python')
and status = 'completed'
) t
WHERE rk = 2
) t2 on t1.user_id = t2.user_id
JOIN (
SELECT user_id,count(1) cnt
FROM order_info
WHERE date > '2025-10-15'
and product_name in ('C++','Java','Python')
and status = 'completed'
GROUP BY user_id
HAVING count(1) > 1
) t3 ON t1.user_id = t3.user_id
ORDER BY t3.user_id
1、找到用户第一次购买日期
SELECT user_id,date as first_buy_date
FROM(SELECT user_id,date,
ROW_NUMBER()OVER(PARTITION BY user_id ORDER BY date) rk
FROM order_info
WHERE date > '2025-10-15'
and product_name in ('C++','Java','Python')
and status = 'completed'
) t
WHERE rk = 1
2、找到用户第二次购买日期
SELECT user_id,date as second_buy_date
FROM(SELECT user_id,date,
ROW_NUMBER()OVER(PARTITION BY user_id ORDER BY date) rk
FROM order_info
WHERE date > '2025-10-15'
and product_name in ('C++','Java','Python')
and status = 'completed'
) t
WHERE rk = 2
3、用户购买次数 >= 2
SELECT user_id,count(1) cnt
FROM order_info
WHERE date > '2025-10-15'
and product_name in ('C++','Java','Python')
and status = 'completed'
GROUP BY user_id
HAVING count(1) > 1
4、三表连接,完整代码如下
SELECT DISTINCT t3.user_id,t1.first_buy_date,t2.second_buy_date,t3.cnt
FROM(SELECT user_id,date as first_buy_date
FROM(SELECT user_id,date,
ROW_NUMBER()OVER(PARTITION BY user_id ORDER BY date) rk
FROM order_info
WHERE date > '2025-10-15'
and product_name in ('C++','Java','Python')
and status = 'completed'
) t
WHERE rk = 1
) t1
JOIN (
SELECT user_id,date as second_buy_date
FROM(SELECT user_id,date,
ROW_NUMBER()OVER(PARTITION BY user_id ORDER BY date) rk
FROM order_info
WHERE date > '2025-10-15'
and product_name in ('C++','Java','Python')
and status = 'completed'
) t
WHERE rk = 2
) t2 on t1.user_id = t2.user_id
JOIN (
SELECT user_id,count(1) cnt
FROM order_info
WHERE date > '2025-10-15'
and product_name in ('C++','Java','Python')
and status = 'completed'
GROUP BY user_id
HAVING count(1) > 1
) t3 ON t1.user_id = t3.user_id
ORDER BY t3.user_id

查看16道真题和解析