题解 | #多层子查询+开窗函数#
牛客的课程订单分析(五)
https://www.nowcoder.com/practice/348afda488554ceb922efd2f3effc427
SELECT
user_id,
qian first_buy_date,
date second_buy_date,
cnt
FROM
(
SELECT
user_id,
min(date) over(partition by user_id) qian, 要点二
date,
row_number() over(partition by user_id order by date ) paimin,
count(product_name) over(partition by user_id) cnt
FROM
order_info
WHERE user_id IN 要点一
(
SELECT
user_id
FROM
order_info
WHERE date>"2025-10-15"
AND product_name IN ("C++","Java","Python")
AND status="completed"
GROUP BY user_id
HAVING count(product_name)>1
)
AND date>"2025-10-15"
AND product_name IN ("C++","Java","Python")
AND status="completed"
) a
WHERE paimin=2
要点一:和以前的课程订单分析一样,先筛选出符合要求的user_id,再用where+子查询过滤,之所以这么麻烦,是因为使用Group by后只能输出被分组和在聚合函数里的字段
要点二:求多个最值问题,使用开窗排序函数+where筛选就好,为什么这里要计算最小值呢?
如果你观察表结构就会发现,第一次购买的日期和第二次购买的日期是出现在同一行的,上述方法用where无法实现分别筛选,同一行的日期都是一样的。
所以这里先把最小值算出来,再用开窗排序函数+where的方法找出第二次购买日期,这样就可以放在同一行了