1. 分组去重
取出连续七天都有交易记录的用户的每天的第一笔订单
思路,先通过(用户名, 交易时间)排序,然后使用row_number() over (partition by 用户名,交易时间(年月日) order by 时间戳) 进行去重,得到每个用户每一天的第一笔交易 ;然后将该表作为子表,再通过group by 用户 筛选出交易天数=7的用户。
关键语句:
select f1, f2 from
(select f1,f2,row_number() over( partition by f1 order by f2 asc) rn from tb)
where rn = 1;
2. 窗口函数
rank、dense_rank、row_number
基本用法:select f1,f2,row_number() over( partition by f1 order by f2 asc) rn from t
功能相同,都是用于给记录编号,编号方式有细微差别
rank编号时,相同的记录,编号相同,但后续记录会跳过重复次数继续编号(如有两条相同记录,两条记录都被编号为3,则紧跟其后的下一条记录被编号为5)
dense_rank 与rank类似,但在有重复记录时,后续编号依然连续
row_number 连续编号,每条记录的编号不同,即使记录相同
3. ntile:将数据按照指定数字均分分配到多个桶中,可用于取出前1/n的数据
select * from (
select id,
name,
sal,
NTILE(2) over(partition by name order by sal desc ) rn
from f_test
) t where t.rn=1