本题个人认为只要用好窗口化,思维量很小
思路如下:
1.首先利用子查询开三个窗,第一个窗获得每个用户的时间排序(主要用于获得第二次的时间),
第二个窗获得cnt 和前面几题的group by 作用相同,第三个窗口获得每个用户的第一次登陆时间
2.接下来对子查询限定条件,要求满足时间 、状态以及 语言类型
3.外层查询,分别查询要求返回的列,注:此处where语句只需要限定排名为2的即可了,这样可自动剔除登陆次数不满足2次的,此外排名为2子查询中的date即为第二次的date
select user_id,g.fir_date,g.date,g.cnt from (select * ,rank() over(partition by user_id order by date) as d, count(*) over(partition by user_id) cnt,min(date) over(partition by user_id order by date) fir_date from order_info where date>'2025-10-15' and status= 'completed' and product_name !='JS') g where g.d =2