提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
我们在Oracle中,经常会出现这样的数据:

用户名密码修改时间
user1abcd12022-06-09 00:00:00
user1abcd22022-06-08 00:00:00
user1abcd32022-06-07 00:00:00
user2abcd12022-06-09 00:00:00
user2abcd22022-06-08 00:00:00
user2abcd32022-06-07 00:00:00
user3abcd12022-06-09 00:00:00
user3abcd22022-06-08 00:00:00
user3abcd32022-06-07 00:00:00

那么,如果我们要取出每个用户的最新密码,就会使用到row_number\partition by

提示:以下是本篇文章正文内容,下面案例可供参考

一、row_number是什么?

row_number 就是为了赋予每一行一个序号,序号从1开始递增

select 
	a.* ,
	row_number() over (
		order by 修改时间 desc
	) as 序号
from 表名 as a

效果:

用户名密码修改时间序号
user1abcd12022-06-09 00:00:001
user2abcd12022-06-09 00:00:002
user3abcd12022-06-09 00:00:003
user1abcd22022-06-08 00:00:004
user2abcd22022-06-08 00:00:005
user3abcd22022-06-08 00:00:006
user1abcd32022-06-07 00:00:007
user2abcd32022-06-07 00:00:008
user3abcd32022-06-07 00:00:009

二、partition by是什么?

我们在代码中加入partition by

select 
	a.* ,
	row_number() over (
		partition by 用户名 order by 修改时间 desc
	) as 序号
from 表名 as a

效果:

用户名密码修改时间序号
user1abcd12022-06-09 00:00:001
user1abcd22022-06-08 00:00:002
user1abcd32022-06-07 00:00:003
user2abcd12022-06-09 00:00:001
user2abcd22022-06-08 00:00:002
user2abcd32022-06-07 00:00:003
user3abcd12022-06-09 00:00:001
user3abcd22022-06-08 00:00:002
user3abcd32022-06-07 00:00:003

三、加上条件筛选你想要的记录

通过row_number / partition by ,我们已经将这些数据,按照用户名进行分组,且在每组用户名中,以倒序对修改时间进行了排序,并将每组内的记录赋予了相应的序号。
最后,我们只需要再加入筛选条件,就可以把最新修改的密码筛选出来

select * from
(
	select 
		a.* ,
		row_number() over (
			partition by 用户名 order by 修改时间 desc
		) as 序号
	from 表名 as a
) as t
where 序号 = 1

同样,你可以用下面的with 方法,将添加排序的数据命名成表名

with t as(
	select 
		a.* ,
		row_number() over (
			partition by 用户名 order by 修改时间 desc
		) as 序号
	from 表名 as a
)

select * from t where 序号 = 1
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐