问题:查询分组后第一次购买和第二次购买的订单信息
方法一
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

京公网安备 11010502036488号