函数语法: ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

函数作用:从1开始,为按组排序的每条记录添加一个序列号  函数只能用于select和order by子句中 不能用在where子句

不分组排序

不进行分组时语法为ROW_NUMBER() OVER(ORDER BY COLUMN),如:

有一个表A就一个字段num,数据如下

num

10

20

30

查询语句为select row_number() over(order by num) as idx,num from A

结果如下

num      idx

10          1

20          2

30          3

分组排序

分组的话ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)表示根据COL1分组,在分组内部根据COL2排序,

而此函数的结果值就表示每组内部排序后的顺序编号(组内连续的惟一的)

表employee有数据如下

empid        deptid            salary

1               10                   5500.00

2               10                   4500.00

3                20                  1900.00

4               20                   4800.00

查询语句为:select *,row_number() over(partition by deptid order by salary desc) rank from employee

结果如下

empid        deptid             salary            rank

1                10                   5500.00        1

2                 10                  4500.00         2

4                 20                  4800.00         1

3                 20                  1900.00         2

比较

可以看到这个函数不分组时的作用oracle自带row_num也能完成,差别就是row_num从0开始。分组排序这个功能就比较强大

另外还有两个类似函数rank() over() 和dense_rank() over()

区别就是如果排序字段有重复值

row_number()函数还是1 2 3排下去

rank() over()则会出现 1  1  3

dense_rank() over() 则会出现 1 1 2

这三种情况 就是给的序号不一样

转载:https://www.cnblogs.com/alsf/p/6344197.html

http://www.cnblogs.com/BluceLee/p/8004716.html

1、row_number() over()排序功能:

(1) row_number() over()分组排序功能:

在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by  order by 的执行。

partition by 用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。

例如:employee,根据部门分组排序。

SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (partition by workdept ORDER BY salary desc) rank FROM employee

--------------------------------------

000010 A00 152750 1

000110 A00 66500 2

000120 A00 49250 3

200010 A00 46500 4

200120 A00 39250 5

000020 B01 94250 1

000030 C01 98250 1

000130 C01 73800 2

(2)对查询结果进行排序:(无分组)

SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (ORDER BY salary desc) rank FROM employee

--------------------------------------

000010 A00 152750 1

000030 C01 98250 2

000070 D21 96170 3

000020 B01 94250 4

000090 E11 89750 5

000100 E21 86150 6

000050 E01 80175 7

000130 C01 73800 8

000060 D11 72250 9

row_number() over()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).

2、rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).

select workdept,salary,rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept;

------------------

A00 39250 1

A00 46500 2

A00 49250 3

A00 66500 4

A00 152750 5

B01 94250 1

C01 68420 1

C01 68420 1

C01 73800 3

3、dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .

select workdept,salary,dense_rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept;

------------------

A00 39250 1

A00 46500 2

A00 49250 3

A00 66500 4

A00 152750 5

B01 94250 1

C01 68420 1

C01 68420 1

C01 73800 2

C01 98250 3

使用ROW_NUMBER删除重复数据

---假设表TAB中有a,b,c三列,可以使用下列语句删除a,b,c都相同的重复行。

DELETE FROM (select year,QUARTER,RESULTS,row_number() over(partition by YEAR,QUARTER,RESULTS order by YEAR,QUARTER,RESULTS) AS ROW_NO FROM SALE )

WHERE ROW_NO>1

oracle 判断重复次数,sql 查询 某字段 重复次数 最多的记录相关推荐

  1. sql查询某字段重复的数据

    sql查询某字段重复的数据 最近老是遇到添加新的约束问题,其中就有要求数据不能重复,那么以前哪些测试数据就不方便改了,但是又不能删除,所以为了防止重复,我们只能查询出来一个个改了,那么查询的Sql语句 ...

  2. mysql、oracle、pg、sql查询、删除重复数据保留一条

    1.单个字段查询.去重 查询单字段重复数据 select * from 表名称 where 字段 in (select 字段 from 表名称 group by 字段 having count(1) ...

  3. sql 查询某个字段 出现次数 或者 次数大于1 或者 出现次数最多

    一.sql 语句查询某个字段出现的次数: sql 语句如下 --查询某个字段出现的次数 select site,count(site) 次数 from a_cost group by site ord ...

  4. pl/sql查询 某个字段重复

    SELECT A,COUNT(*) FROM  表 GROUP BY A HAVING COUNT(*) > 1;

  5. oracle判断字段为空时选用别的字段_oracle中使用sql查询时字段为空则赋值默认

    转至:http://www.th7.cn/db/Oracle/201501/86125.shtml oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 oracle 函数介绍之nvl ...

  6. oracle中使用sql查询时字段为空则赋值默认

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 oracle 函数介绍之nvl ...

  7. java使用jdbc连接oracle,实现自定义sql查询,加载字段注释

    java使用jdbc连接oracle,实现自定义sql查询,加载字段注释 第一步.加载驱动 引用包 import java.sql.Connection; import java.sql.Driver ...

  8. mysql sql 去除重复行_SQL查询语句去除重复行

    1.存在两条完全相同的纪录 这是最简单的一种情况,用关键字distinct就可以去掉 select distinct * from table(表名) where (条件) 2.存在部分字段相同的纪录 ...

  9. vba ado 执行多条mysql 语句,Excel VBA+ADO+SQL入门教程003:SQL查询中字段技巧的总结...

    原标题:Excel VBA+ADO+SQL入门教程003:SQL查询中字段技巧的总结 本章概要: 1,几个概念 1.1, 数据库和Excel工作簿 1.2,数据表和Excel工作表 1.3,记录.字段 ...

最新文章

  1. delphi socket 流的使用_基于TCP协议的Socket编程和通信_单向通信
  2. Android开发过程中在sh,py,mk文件中添加log信息的方法
  3. 使用ildasm和ilasm修改dll
  4. flutter实现底部弹出框以及特色功能
  5. IM即时通讯:如何跳出传统思维来设计聊天室架构?
  6. 建立表/索引时的 存储参数:【PCTUSED参数与PCTFREE参数】
  7. Spring Boot的exit code
  8. 使用telnet命令测试网络时连接建立后无法退出解决办法
  9. 【C++】C++11 新特性(auto,decltype,nullptr,快速遍历,【Lambda表达式详解】)
  10. php四种基础算法:冒泡,选择,插入和快速排序法PHP基础教程
  11. 我们公司不会用分布式事务!
  12. Linux 安装python 模块及库
  13. AutoCAD 2008中文版实用自学手册•机械设计篇
  14. 面试官:说说什么是 Java 内存模型(JMM)?
  15. b站学python哪个好学_B站上那个不用钱的学习python的资源
  16. 水星路由器登录界面找不到服务器,新版水星(Mercurey)路由器后台登陆界面打不开怎么办?...
  17. Win10恢复照片查看器
  18. 【030】纪妖–正版妖怪百科资料库
  19. c语言 for each循环,C#中foreach循环对比for循环的优势和劣势
  20. Python+大数据-数据处理与分析-pandas快速入门

热门文章

  1. 在计算机科学中 算法这个术语是指什么,algorithm
  2. Python实战之小说下载神器(二)整本小说下载:看小说不用这个程序,我实在替你感到可惜*(小说爱好者必备)
  3. 来!学逆向都想的手游防护(下篇更新破解)
  4. SAP FICO 定义成本组件结构
  5. LC滤波器的截止频率公式
  6. 域控知识与安全01:域控知识基础
  7. 某IOT设备漏洞分析
  8. matlab 标量双精度值,matlab数据类型(数值类型)
  9. bootstrapCDN地址
  10. 解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找