row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。

与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。

与此功能相似的函数还有:rank/dense_rank/ntile

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

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

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

oracle 分析函数 row_number(),返回一个整数值(>=1)

测试表/数据

CREATE TABLE test_course (

student_name  VARCHAR(10),  -- 学生

course_name   VARCHAR(10),  -- 课程

grade         INT           -- 成绩

);

INSERT INTO test_course VALUES('甲', '语文', 95);

INSERT INTO test_course VALUES('乙', '语文', 85);

INSERT INTO test_course VALUES('丙', '语文', 75);

INSERT INTO test_course VALUES('丁', '语文', 65);

INSERT INTO test_course VALUES('戊', '语文', 55);

INSERT INTO test_course VALUES('己', '语文', 50);

INSERT INTO test_course VALUES('庚', '语文', 60);

INSERT INTO test_course VALUES('辛', '语文', 70);

INSERT INTO test_course VALUES('壬', '语文', 80);

INSERT INTO test_course VALUES('奎', '语文', 90);

INSERT INTO test_course VALUES('甲', '数学', 90);

INSERT INTO test_course VALUES('乙', '数学', 80);

INSERT INTO test_course VALUES('丙', '数学', 70);

INSERT INTO test_course VALUES('丁', '数学', 60);

INSERT INTO test_course VALUES('戊', '数学', 50);

INSERT INTO test_course VALUES('己', '数学', 50);

INSERT INTO test_course VALUES('庚', '数学', 60);

INSERT INTO test_course VALUES('辛', '数学', 70);

INSERT INTO test_course VALUES('壬', '数学', 85);

INSERT INTO test_course VALUES('奎', '数学', 95);

ROW_NUMBER 顺序编号

按照分数 编号 从高到底

SELECT

ROW_NUMBER() OVER( ORDER BY SUM(grade) DESC) AS NO,

student_name,

SUM(grade) AS AllGrade

FROM

test_course

GROUP BY

student_name

ORDER BY

SUM(grade) DESC

1 甲 185

2 奎 185

3 壬 165

4 乙 165

5 丙 145

6 辛 140

7 丁 125

8 庚 120

9 戊 105

10 己 100

按照分数 编号 从高到底(区分 课程)

SELECT

ROW_NUMBER() OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,

*

FROM

test_course

ORDER BY

course_name,

grade DESC

1 奎 数学 95

2 甲 数学 90

3 壬 数学 85

4 乙 数学 80

5 丙 数学 70

6 辛 数学 70

7 庚 数学 60

8 丁 数学 60

9 戊 数学 50

10 己 数学 50

1 甲 语文 95

2 奎 语文 90

3 乙 语文 85

4 壬 语文 80

5 丙 语文 75

6 辛 语文 70

7 丁 语文 65

8 庚 语文 60

9 戊 语文 55

10 己 语文 50

RANK 排名不连续

按照分数 排名 从高到底

SELECT

RANK() OVER( ORDER BY SUM(grade) DESC) AS NO,

student_name,

SUM(grade) AS AllGrade

FROM

test_course

GROUP BY

student_name

ORDER BY

SUM(grade) DESC

1 甲 185

1 奎 185

3 壬 165

3 乙 165

5 丙 145

6 辛 140

7 丁 125

8 庚 120

9 戊 105

10 己 100

按照分数 排名 从高到底(区分 课程)

SELECT

RANK() OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,

*

FROM

test_course

ORDER BY

course_name,

grade DESC

1 奎 数学 95

2 甲 数学 90

3 壬 数学 85

4 乙 数学 80

5 丙 数学 70

5 辛 数学 70

7 庚 数学 60

7 丁 数学 60

9 戊 数学 50

9 己 数学 50

1 甲 语文 95

2 奎 语文 90

3 乙 语文 85

4 壬 语文 80

5 丙 语文 75

6 辛 语文 70

7 丁 语文 65

8 庚 语文 60

9 戊 语文 55

10 己 语文 50

DENSE_RANK 排名连续

按照分数 排名 从高到底

SELECT

DENSE_RANK() OVER( ORDER BY SUM(grade) DESC) AS NO,

student_name,

SUM(grade) AS AllGrade

FROM

test_course

GROUP BY

student_name

ORDER BY

SUM(grade) DESC

1 甲 185

1 奎 185

2 壬 165

2 乙 165

3 丙 145

4 辛 140

5 丁 125

6 庚 120

7 戊 105

8 己 100

按照分数 排名 从高到底(区分 课程)

SELECT

DENSE_RANK() OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,*

FROM

test_course

ORDER BY

course_name,

grade DESC

1 奎 数学 95

2 甲 数学 90

3 壬 数学 85

4 乙 数学 80

5 丙 数学 70

5 辛 数学 70

6 庚 数学 60

6 丁 数学 60

7 戊 数学 50

7 己 数学 50

1 甲 语文 95

2 奎 语文 90

3 乙 语文 85

4 壬 语文 80

5 丙 语文 75

6 辛 语文 70

7 丁 语文 65

8 庚 语文 60

9 戊 语文 55

10 己 语文 50

NTILE 分组

按照分数 划分5个区间 从高到底

SELECT

NTILE(5) OVER( ORDER BY SUM(grade) DESC) AS NO,

student_name,

SUM(grade) AS AllGrade

FROM

test_course

GROUP BY

student_name

ORDER BY

SUM(grade) DESC

1 甲 185

1 奎 185

2 壬 165

2 乙 165

3 丙 145

3 辛 140

4 丁 125

4 庚 120

5 戊 105

5 己 100

按照分数 划分区间 从高到底(区分 课程)

SELECT

NTILE(5) OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,

*

FROM

test_course

ORDER BY

course_name,

grade DESC

1 奎 数学 95

1 甲 数学 90

2 壬 数学 85

2 乙 数学 80

3 丙 数学 70

3 辛 数学 70

4 庚 数学 60

4 丁 数学 60

5 戊 数学 50

5 己 数学 50

1 甲 语文 95

1 奎 语文 90

2 乙 语文 85

2 壬 语文 80

3 丙 语文 75

3 辛 语文 70

4 丁 语文 65

4 庚 语文 60

5 戊 语文 55

5 己 语文 50

使用分析函数来进行去重的例子:

product

loid

time

aaa

AAABBBCCC

2013-4-5

aaa

CCC55SSADD

2013-4-13

bbb

FFFF223SSSA

2013-8-8

bbb

GSAAASSFBB

2013-8-1

数据结构如上图,其中第1列有重复,第2列唯一,第3列为时间,有大小唯一。需求:一个product只能有一个loid,现需要根据时间大小,保留最后一次增加的数据,将时间小的product删除。最后得到结果如下:

product

loid

time

aaa

CCC55SSADD

2013-4-13

bbb

FFFF223SSSA

2013-8-8

思路:根据product来进行分组编号,通过时间大小来排序。筛选出时间最大的loid,再根据loid将product重复的删除)

select row_number() over(partition by product order by time desc) as no,product,loid,time from test;    --通过分析函数进行分组编号

select loid from (select row_number() over(partition by product order by time desc) as no,product,loid,time from test) where no=1;  ---得出满足条件的loid,因为为降序,所以不管product重复的有几个,编号为1的始终为分组内时间最大的

delete from test where loid not in (select loid from (select row_number() over(partition by product order by time desc) as no,product,loid,time from test) where no=1);    --根据得出的满足条件的loid来进行筛选删除。

此为通过分析函数来去重的例子,其他重复数据的查找与删除,可通过rowid或分组来进行。

oracle 排序的分析函数,oracle下数据的排序分组row_number() over()--分析函数,可用于去重...相关推荐

  1. Oracle——删除用户以及用户下数据

    Oracle中删除用户下所有对象的多种方法 2015-09-22 13:12  8299人阅读  评论(0)  收藏  举报   分类: Oracle数据库基本管理(336)   oracle安装升级 ...

  2. Oracle删除用户以及用户下数据

    Oracle删除用户下所有对象的方法未必人人都会,下面就为您介绍两种常用的Oracle删除用户下所有对象的方法,希望对您学习Oracle删除用户方面能有所帮助. 方法1: drop user XXXX ...

  3. oracle怎么导出筛选后的数据,ORACLE,筛选单字段不重复的记录,保留其他字段....

    在ORACLE中,我们常常对数据进行排序和筛选,例如:成绩表中,将某一个人的所有科目成绩放到一起来看,那么我们会使用ORDER BY 语句. 例如表T1: Name   Subject     Sco ...

  4. 你真的会Excel排序吗?这四种高级排序不容错过

    点赞再看,养成习惯:知己知彼,百战不殆. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文 GitHub https://github.com/hugogoos/Excel 已收录,包含Ex ...

  5. python五种常见的排序方法是_python中序列的排序,sorted方法、reversed方法的使用...

    简介 INTRODUCTION 包括字典排序.列表排序.升序.降序.逆序 一.基础概念 我们知道python中的内建序列包括字典.列表.元组.字符串等,序列是python中最基本的数据结构. 列表.元 ...

  6. 排序excel怎么设置_Excel排序技巧:这些不同方式的排序方法你都会了么?

    大家好,我是你们的小可-不知小伙伴们工作面对一堆表格时,有没有计算机二级白学的赶脚.今天小可带大家来学几个排序小技巧~ 1.常用排序快捷键 你对数据进行排序还在顶栏菜单找排序吗? NONO!比较快捷的 ...

  7. oracle 排序的分析函数,Oracle分析函数用法详解

    OVER(PARTITION BY)开窗函数用法 开窗函数,Oracle从8.1.6开始提供开窗函数,开窗函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是: 对于每个组返回多行,而聚合函数对于 ...

  8. oracle 数据分析函数,ORACLE分析函数(一)

    ORACLE分析函数(1) 分析函数式ORACLE提供的用来进行数据统计的强有力工具,与我们常用的聚合函数具有一些相似性,但又完全不同.聚合函数,首先会将数据进行分组,然后对每一组数据进行运算,如求和 ...

  9. 5、oracle下数据完整性约束

    ORACLE下数据完整性约束 为了保证数据的完整性和结构的正确性,oracle也有很多约束条件. 1.数据完整性 为了保证数据的完整性,一般对数据列(字段)进行如下约束,主键约束(PRIMARY KE ...

最新文章

  1. jca分析java dump日志
  2. 阿里云ONS而微软Azure Service Bus体系结构和功能比较
  3. getOutputStream() has already been called for this response异常的原因和解决方法
  4. c++ static关键字的作用
  5. 【51Nod - 1182】完美字符串(贪心,字符串)
  6. vim自己主动缩进配置
  7. sed-awk命令详解
  8. idea修改回默认字体,设置 IntelliJ Idea 的中英文字体
  9. matlab 文本处理
  10. Windows Azure Cloud Service (24) 在模拟器中运行时跳过Windows Azure Startup任务
  11. 移动零售批发行业新的技术特色-智能PDA手持移动扫描打印销售开单收银仪!!...
  12. 控制工程——传递函数与状态方程
  13. 如何使用卷积神经网络进行图像处理?
  14. 点对点传输现状,镭速高速点对点传输解决方案
  15. 幼儿抽象逻辑思维举例_张俊:幼儿到底是怎么学习数学的?
  16. PHP redis key
  17. (计算几何+二分+网络流)P4048 [JSOI2010]冷冻波
  18. 计算机操作系统相关论文,计算机操作系统的基本功能及应用论文
  19. 下载python后怎么运行代码,怎样下载python的编译器
  20. Window环境下运行YOLO v4目标检测算法

热门文章

  1. 关于Matconvnet中Conv-ReLU-Pool-NormBatch的总结与思考
  2. C++类内存分布——深度理解继承与虚函数
  3. [OS复习]进程管理4
  4. 如何提升网站在移动端的打开速度(转)
  5. JSF的web.xml配置
  6. 低版本ulibc支持recvmmsg sendmmsg功能
  7. 如何给Typora安装主题
  8. 【放洋屁了】知识焦虑-几点感慨
  9. 关于USB的8个问题
  10. zcmu-1957(状态压缩枚举)