如果有分组,分组之后相同的为一组,那么在这相同的一组里面,就会有序号。
比如有一个数据表t_test,拥有的字段是
Id,name,create_datetime,creator,note,province serial_no
1 张三 2023-01-01 admin xx 广东 1 分组①
2 张三 2023-01-01 admin xx 广东 2
3 李四 2023-01-01 admin xx 辽宁 1 分组②
4 王五 2023-01-01 admin xx 广西 1
5 赵六 2023-01-01 admin xx 广西 2 分组③
6 钱七 2023-01-01 admin xx 山西 1 分组④
7 丈八 2023-01-01 admin xx 陕西 1 分组⑤
8 老九 2023-01-01 admin xx 陕西 2
select * from(Select * ,ROW_NUMBER() OVER(PARTITION BY province) as serial_no from t_test)
Temp where temp.serial_no = 1;
查询的结果是
Id,name,create_datetime,creator,note,province serial_no
1 张三 2023-01-01 admin xx 广东 1
3 李四 2023-01-01 admin xx 辽宁 1
4 王五 2023-01-01 admin xx 广西 1
6 钱七 2023-01-01 admin xx 山西 1
7 丈八 2023-01-01 admin xx 陕西 1
总结:
什么情况下适合使用该函数?
适用于将数据分组之后取top值或者bottom值以及中间middle值(根据序号去操作);
也适用于对一些杂乱无章的记录 按照相同分组放到一起 方便查看
注意!但是over里面的partition by分组和group by分组是不同的,虽然都是叫分组,但是partition by分组不会改变记录行数,而group by是会改变的,比如广东省分的数据有两条嘛,按照province分组之后,相同为一组,所以最终只会显示一条记录。