关于Oracle row_number() over()的简单使用

简单介绍:在Oracle中使用row_number() over()函数,对查询的结果进行分组,并支持分组后的排序功能,这是我使用之后的简单理解。

场景1:在面试过程中经常遇到的一个问题,把一个班中每一科成绩最高的人查找出来。

思路:查询出一个班所有科目的成绩,使用row_number() over()按照科目分组并按成绩降序排列。

表数据如图所示:

sql语句:

SELECT T.NAME,T.SUBJECT,T.SCORE  ,row_number()OVER(PARTITION BY T.SUBJECT ORDER BY T.SCORE DESC) SEQ FROM JAVA_SCORE T;排序结果:

场景2:删除成绩表中科目重复的数据,仅保留分数最高的一条。

思路:row_number()OVER(PARTITION  By 字段1,字段2 ORDER BY 排序字段)中的PARTITION  By作用于分组函数group一致,但是row_number()OVER()的执行是在where 、group by、  order by 之后执行的。也就是对结果一个分组排序。

SQL:

DELETE FROM JAVA_SCORE where id in(                       --执行删除操作
  SELECT ID FROM (
         SELECT T.ID, T.NAME,T.SUBJECT,T.SCORE  ,row_number()OVER(PARTITION BY T.SUBJECT ORDER BY T.SCORE DESC) SEQ FROM JAVA_SCORE T --按照科目分组,并根据分数排序
  ) T WHERE T.SEQ > 1 --筛选不是第一名的数据
)

原文地址:https://www.cnblogs.com/duck-ifox/p/12339730.html

时间: 2024-10-12 15:32:14

关于Oracle row_number() over()的简单使用的相关文章

Oracle中的存储过程简单例子

---创建表 create table TESTTABLE ( id1  VARCHAR2(12), name VARCHAR2(32) ) select t.id1,t.name from TESTTABLE t insert into TESTTABLE (ID1, NAME) values ('1', 'zhangsan'); insert into TESTTABLE (ID1, NAME) values ('2', 'lisi'); insert into TESTTABLE (ID1

oracle开机自启动-超简单

1. 在/etc/oratab中作如下修改$ORACLE_SID:$ORACLE_HOME:Y例如vi /etc/orataborcl:/u01/app/oracle/product/10.2.0/db_1:Y 2.  修改/etc/rc.localsu - oracle -c "$ORACLE_HOME/bin/lsnctl start"su - oracle -c "$ORACLE_HOME/bin/dbstart start"例如vi /etc/rc.loca

数据库迁移之从oracle 到 MySQL最简单的方法

数据库迁移之从oracle 到 MySQL最简单的方法 因工作需要将oracle数据库换到MySQL数据库,数据量比较大,百万级别的数据,表也比较多,有没有一种既快捷又安全的方法呢?答案是肯定的,下面介绍一个工具,非常的好用 需要的工具:Navicat Premium  Navicat Premium 原本是收费的,但是网上也有很多绿色版(盗版)的,本人亲测,也挺好用的,土豪可以忽略这句话. 第一步: 安装Navicat Premium,打开软件,建立数据库的链接,一个是原oracle数据库的链

Oracle的REGEXP_INSTR函数简单使用方法

REGEXP_INSTR函数让你搜索一个正則表達式模式字符串. 函数使用输入字符集定义的字符进行字符串的计算. 它返回一个整数,指示開始或结束匹配的子位置.这取决于return_option參数的值.假设没有找到匹配.则函数返回0. 语法 Oracle数据库中的REGEXP_INSTR函数的语法是: REGEXP_INSTR (source_char, pattern [, position [, occurrence [, return_option [, match_parameter ]

oracle row_number()

要求查询每个用户对应的最大样品信息,忽然想到ms sql提供过 row_number() over(partition by 列 order by 列 desc),那么oracle可能也存在, 我的表结构如下: create table NEOGOODSRULE ( ID NUMBER(22) not null, PERSONALID NVARCHAR2(50), CT_SMP_TYPE NVARCHAR2(100) ) tablespace VGSM pctfree 10 initrans 1

Oracle的REGEXP_INSTR函数简单用法

REGEXP_INSTR函数让你搜索一个正则表达式模式字符串.函数使用输入字符集定义的字符进行字符串的计算. 它返回一个整数,指示开始或结束匹配的子位置,这取决于return_option参数的值.如果没有找到匹配,则函数返回0. 语法 Oracle数据库中的REGEXP_INSTR函数的语法是: REGEXP_INSTR (source_char, pattern [, position [, occurrence [, return_option [, match_parameter ] ]

oracle学习 第一章 简单的查询语句 ——04

1.5 如何在SQL语句中使用算数表达式 可以在SQL语句中使用表达式.在表达式中可以使用一下4种运算符:+,-,*,/ 它们分别代表加.减.乘.除. 设想一下,在某一天,有个社会团体和工会团体参观你们的公司,您的老板为了树立公司的光辉形象,它要求您把午餐和茶水的费用加到员工的工资里并打印一张工资清单.于是您大概算了一下,其费用约合500元/月.之后您用例1-11的查询得到了老板索要的员工的工资清单. 例 1-11 SQL> SELECT empno,ename,sal,500+sal 2 FR

oracle学习 第一章 简单的查询语句 ——03

1.1最简单的查询语句 例 1-1 SQL> select * from emp; 例 1-1 结果 这里的 * 号表示所有的列,它与在select 之后列出所有的列名是一样的.查询语句以分号( ; )结束.emp(employee)是一个员工表. 1.2 在查询语句中如何选择特定的列 在平时的使用过程中我们需要的往往只是一张表中的某一条或者某几条数据而已,但上面查询的结果可能看起来比较乱.如果我们指向知道若干个特定列的信息,使用select 语句很容易就可以做到.就好比我们去菜市场买东西,不会

Oracle 的ORION工具简单使用

1. 下载地址: http://www.oracle.com/technetwork/cn/topics/index-088165-zhs.html 2. linux x64 还有 windows的 安装文件皆可以 3. windows上面安装, linux上面暂时没安装 4. 进入安装目录 orion -help 查看帮助信息 5. 最简单的压力测试 创建一个lun文件 比如 WindowsIO.lun 测试C盘的话 输入 \\.\C: 测试D盘的话输入 \\.\D: 6. 最简单的测试 在安