第一步通过窗口函数生成日期升序的字段rn和用户买课次数的字段 cnt,其余条件直接用where筛选,即 (
SELECT
user_id,
date,
COUNT(*) OVER (PARTITION BY user_id) AS cnt,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY date) AS rn
FROM
order_info
WHERE
date > '2025-10-15'
AND status = 'completed'
AND product_name IN ('C++', 'Python', 'Java')
) as RankedOrders
第二步在此基础上通过case when函数筛选出日期排名第一和第二的结果并分别命名first_buy_date,second_buy_date,且用where函数选出2次以上买课并最后用user_id排序,即
SELECT
user_id,
MIN(CASE WHEN rn = 1 THEN date END) AS first_buy_date,
MIN(CASE WHEN rn = 2 THEN date END) AS second_buy_date,
cnt
FROM (
SELECT
user_id,
date,
COUNT(*) OVER (PARTITION BY user_id) AS cnt,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY date) AS rn
FROM
order_info
WHERE
date > '2025-10-15'
AND status = 'completed'
AND product_name IN ('C++', 'Python', 'Java')
) as RankedOrders
WHERE
cnt >= 2
GROUP BY
user_id;