语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
row_number() over()分组排序功能:
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行。

例一:

表数据:

create table TEST_ROW_NUMBER_OVER(
id varchar(10) not null,
name varchar(10) null,
age varchar(10) null,
salary int null
);
select * from TEST_ROW_NUMBER_OVER t;

insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,‘a’,10,8000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,‘a2’,11,6500);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,‘b’,12,13000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,‘b2’,13,4500);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,‘c’,14,3000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,‘c2’,15,20000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(4,‘d’,16,30000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(5,‘d2’,17,1800);
一次排序:对查询结果进行排序(无分组)

select id,name,age,salary,row_number()over(order by salary desc) rn
from TEST_ROW_NUMBER_OVER t
结果:

进一步排序:根据id分组排序

select id,name,age,salary,row_number()over(partition by id order by salary desc) rank
from TEST_ROW_NUMBER_OVER t
结果:

再一次排序:找出每一组中序号为一的数据

select * from(select id,name,age,salary,row_number()over(partition by id order by salary desc) rank
from TEST_ROW_NUMBER_OVER t)
where rank <2
结果:

排序找出年龄在13岁到16岁数据,按salary排序

select id,name,age,salary,row_number()over(order by salary desc) rank
from TEST_ROW_NUMBER_OVER t where age between ‘13’ and ‘16’
**结果:**结果中 rank 的序号,其实就表明了 over(order by salary desc) 是在where age between and 后执行的

例二:
1.使用row_number()函数进行编号,如

select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Customer
原理:先按psd进行排序,排序完后,给每条数据进行编号。

2.在订单中按价格的升序进行排序,并给每条记录进行排序代码如下:

select DID,customerID,totalPrice,ROW_NUMBER() over(order by totalPrice) as rows from OP_Order
3.统计出每一个各户的所有订单并按每一个客户下的订单的金额 升序排序,同时给每一个客户的订单进行编号。这样就知道每个客户下几单了:

select ROW_NUMBER() over(partition by customerID order by totalPrice)
as rows,customerID,totalPrice, DID from OP_Order
4.统计每一个客户最近下的订单是第几次下的订单:

with tabs as
(
select ROW_NUMBER() over(partition by customerID order by totalPrice)
as rows,customerID,totalPrice, DID from OP_Order
)
select MAX(rows) as ‘下单次数’,customerID from tabs
group by customerID
5.统计每一个客户所有的订单中购买的金额最小,而且并统计改订单中,客户是第几次购买的:
思路:利用临时表来执行这一操作。

1.先按客户进行分组,然后按客户的下单的时间进行排序,并进行编号。

2.然后利用子查询查找出每一个客户购买时的最小价格。

3.根据查找出每一个客户的最小价格来查找相应的记录。

with tabs as  (
select ROW_NUMBER() over(partition by customerID  order by insDT)

as rows,customerID,totalPrice, DID from OP_Order
)
select * from tabs
where totalPrice in
(
select MIN(totalPrice)from tabs group by customerID
)
6.筛选出客户第一次下的订单。
思路。利用rows=1来查询客户第一次下的订单记录。

with tabs as
(
select ROW_NUMBER() over(partition by customerID  order by insDT) as rows,* from OP_Order
)
select * from tabs where rows = 1
select * from OP_Order

7.注意:在使用over等开窗函数时,over里头的分组及排序的执行晚于“where,group by,order by”的执行。

select
ROW_NUMBER() over(partition by customerID  order by insDT) as rows,
customerID,totalPrice, DID
from OP_Order where insDT>'2011-07-22'

**三、row_number()与rownum的区别

使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而row_number()在包含排序从句后是先排序再计算行号码。
oracle中rownum

用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。

1、rownum 对于等于某值的查询条件

如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

SQL> select rownum,id,name from student where rownum=1; --有记录
SQL> select rownum,id,name from student where rownum =2; --无记录

2、rownum对于大于某值的查询条件

如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

SQL>select * from(select rownum no ,id,name from student) where no>2; --有记录
SQL> select * from(select rownum,id,name from student)where rownum>2; --无记录

3、rownum对于小于某值的查询条件

如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。

SQL> select rownum,id,name from student where rownum ❤️; --有记录

4、rownum和排序

Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

SQL> select rownum ,id,name from student order by name;

ROWNUM ID NAME


3 200003 李三
2 200002 王二
1 200001 张一
4 200004 赵四

可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询

SQL> select rownum ,id,name from (select * from student order by name);

ROWNUM ID NAME


1 200003 李三
2 200002 王二
3 200001 张一
4 200004 赵四

ROW_NUMBER() OVER()函数相关推荐

  1. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  2. ROW_NUMBER() OVER()函数用法;(分组,排序),partition by

    1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...

  3. ROW_NUMBER() OVER函数的基本用法用法

    ROW_NUMBER() OVER函数的基本用法用法 转自:http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html 语法 ...

  4. sql ROW_NUMBER() 排序函数

    sql ROW_NUMBER() 排序函数 1使用row_number()函数进行编号:如 View Code 1 select email,customerID, ROW_NUMBER() over ...

  5. ROW_NUMBER() OVER() 函数用法详解 (分组排序,多例子)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 语法格式:row_number() over(partition by 分组列 order by 排 ...

  6. ROW_NUMBER() OVER()函数用法详解

    今天同事问了一个关于插入表的问题,对象:被插入表sys_equi_disorg   A  , 查询表sys_equi_dict   B 因为A表的ID不是自增的,并且不能更改表结构,主键默认值还是0, ...

  7. Oracle中ROW_NUMBER() OVER()函数用法

    Oracle中ROW_NUMBER() OVER()函数用法 1. 说明:ROW_NUMBER() OVER() 函数的作用:分组排序 2. 原理: row_number() over() 函数,ov ...

  8. SQL server中ROW_NUMBER() OVER()函数的使用方法

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2 DESC) 注释:COLUMN1:分组列:COLUMN2:排序列 ROW_NUMB ...

  9. row_number() over()函数和with as

    做个笔记 row_number() over(partition by 分组列 order by 排序列 desc) SELECT *FROM (SELECT T.*,ROW_NUMBER() OVE ...

最新文章

  1. 嵌入式linux开发中常见的虚拟机和主机的文件共享问题
  2. css:position
  3. 区块链 PoS 共识——Tendermint
  4. abaqus生成adams柔性体_专栏 | HyperMesh_To_Abaqus接口——模型导入导出问题
  5. linux 脚本调用企业微信_shell或python调用企业微信发送消息(实现报警功能)
  6. docker中运行mysql5.7,使用navicat链接报错10061/10060
  7. MYSQL的空间查询
  8. 计算机本地局域网不通,局域网不通解决方法
  9. Axure 9怎么导入阿里巴巴矢量图标的Iconfont图标
  10. Office Tool Plus 安装2019版Office及Visio
  11. linux进程操作日志文件,我使用过的Linux命令之tailf - 跟踪日志文件/更好的tail -f版本...
  12. 两个PDF比较标出差异_怎样核对两份word文档内容差异?我用2小时,同事仅用2分钟搞定...
  13. [TJOI2019]唱、跳、rap和篮球
  14. 我们不应歧视任何语言,她们都是萌娘!(有图有真相)
  15. CodeForces 1015 C Songs Compression
  16. js 数组按奇偶拆分_js数组拆分问题
  17. 全面接入:ChatGPT杀进15个商业应用,让AI替你打工
  18. android 启动app过程,应用程序进程启动过程
  19. delphi 企业微信消息机器人_消息通知支持企业微信、钉钉机器人,MeterSphere v1.4.0发布...
  20. 多媒体计算机设计原则,多媒体课件的设计原则

热门文章

  1. android 如何打开s3db,Android开发教程:使用已有的SQL数据库
  2. 三七互娱2018校招前端笔试题
  3. dvajs+antd+roadhog 踩坑记录
  4. 【整理】【精华】【实用】常用代码片段
  5. Java在服务器端生成Excel并下载到本地
  6. matlab做polyfit拟合曲线时,报错:多项式未正确设置条件。请添加具有不同 X 值的点,减少多项式的次数,或者尝试按照 HELP POLYFIT 中所述进行中心化和缩放。
  7. POC测试14家!江苏农信上线首个大规模OpenStack农信云
  8. OpenCV:Vec4f二维直线类型
  9. elasticsearch自定义企业词典
  10. JavaScript——优先级队列