问题:查询分组后第一次购买和第二次购买的订单信息
方法一
select 中用 max/min(case when rank=1 then date...)
配合
表中 row_number() over(partition by ... order by date
select a.user_id, max(case when a.rank_no=1 then a.date else 0 end) as first_buy_date, max(case when a.rank_no=2 then a.date else 0 end) as second_buy_date, a.cnt from (select user_id, date, row_number() over(partition by user_id order by date) as rank_no, count(*) over(partition by user_id) as cnt from order_info where date >= '2025-10-16' and status = 'completed' and product_name in('C++','Java','Python') ) a where a.rank_no<=2 and a.cnt>=2 group by a.user_id,a.cnt order by a.user_id ;
方法二
lag(field, num, defaultvalue)---前面第num行的数据
lead(field, num, defaultvalue)---后面第num行的数据
后面跟 over(partition by a1 order by a2)
主要作用:
同个查询取同一字段指定前后第X行。可以作为独立的列,可代替表的自联接,效率更高。
select a.* from (select user_id, min(date) over(partition by user_id) as first_buy_date, lead(date,1,0) over(partition by user_id order by date) as second_buy_date, count(*) over(partition by user_id) as cnt from order_info where date>='2025-10-16' and status='completed' and product_name in('C++','Java','Python') ) a where a.cnt>=2 group by a.user_id order by a.user_id ;
*where & having 的对比 *
用count聚合函数举例
select c
from ( count() over(partition by a) as c)
where c>=2
group by a
=
select count()
from
group by a
having count()>=2