窗口函数和group by的区别
group by分组之后,统计默认只会计算一行记录
窗口函数 分组之后,有多少列显示多少行记录
思路
1.首先过滤筛选不符合的记录,然后根据用户分组,计算出每组用户的排名和统计总数
select
user_id,
date,
dense_rank() over (partition by user_id order by date) as rank_no,
count(*) over (partition by user_id) as cnt
from
order_info
where
product_name in ('Java','C++','Python')
and
status = 'completed'
and
date > '2025-10-15'
2.只取每组排名前2的
select
user_id,
min(t.date),
max(t.date),
t.cnt
from
(
select
user_id,
date,
dense_rank() over (partition by user_id order by date) as rank_no,
count(*) over (partition by user_id) as cnt
from
order_info
where
product_name in ('Java','C++','Python')
and
status = 'completed'
and
date > '2025-10-15'
) t
where
t.rank_no < 3
and
t.cnt >= 2
group by user_id
order by
user_id;