select user_id, 
min(date) as first_buy_date,
max(date) as second_buy_date,
cnt
from (
    select *,
    count(1) 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++', 'Java', 'Python')
) temp
where cnt>=2 and rn<=2
group by user_id, cnt