高效的SQL语句之分析函数

[Oracle]高效的SQL语句之分析函数(二)--max()  如果我们按照示例想得到每个部门薪水值最高的雇员的纪录,可以有四种方法实现:先创建示例表create table empasselect * from scott.emp;alter table empadd constraint emp_pkprimary key(empno);create table deptasselect * from scott.dept;alter t 阅读详情

高效的SQL语句之分析函数--row_number() /rank()/dense_rank

Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)

表示根据COL1分组,在分组内部根据 COL2排序
而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)

RANK() 类似,不过RANK 排序的时候跟派名次一样,可以并列2个第一名之后 是第3名

LAG 表示 分组排序后 ,组内后面一条记录减前面一条记录的差,第一条可返回 NULL

BTW: EXPERT ONE ON ONE 上讲的最详细,还有很多相关特性,文档看起来比较费劲

row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序)
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。
相比之下row_number是没有重复值的
lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。

有些时候我们希望得到指定数据中的前n列,示例如下:

得到每个部门薪水最高的三个雇员:

先创建示例表

create   table  emp
as
select   *   from  scott.emp;

alter   table  emp
add   constraint  emp_pk
primary   key (empno);

create   table  dept
as
select   *   from  scott.dept;

alter   table  dept
add   constraint  dept_pk
primary   key (deptno);

先看一下row_number() /rank()/dense_rank()三个函数之间的区别

  select  emp.deptno,emp.sal,emp.empno,row_number()  over  (partition  by  deptno  order   by  sal  desc ) row_number,   -- 1,2,3
  rank()  over  (partition  by  deptno  order   by  sal  desc ) rank,  -- 1,1,3
  dense_rank()  over  (partition  by  deptno  order   by  sal  desc ) dense_rank  from  emp  -- 1,1,2

结果如下:

10      5000.00      7839      1      1      1
10      2450.00      7782      2      2      2
10      1300.00      7934      3      3      3
20      3000.00      7788      1      1      1
20      3000.00      7902      2      1      1
20      2975.00      7566      3      3      2
20      1100.00      7876      4      4      3
20      800.00      7369      5      5      4
30      2850.00      7698      1      1      1
30      1600.00      7499      2      2      2

取每个部门的薪水前三位雇员:

select  t.deptno,t.rank,t.sal  from
 (
 
select  emp. * ,row_number()  over  (partition  by  deptno  order   by  sal  desc ) row_number,   -- 1,2,3
  rank()  over  (partition  by  deptno  order   by  sal  desc ) rank,  -- 1,1,3
  dense_rank()  over  (partition  by  deptno  order   by  sal  desc ) dense_rank  from  emp  -- 1,1,2
 ) t
where  t.rank <= 3

结果如下:

10      1      5000.00
10      2      2450.00
10      3      1300.00
20      1      3000.00
20      1      3000.00
20      3      2975.00
30      1      2850.00
30      2      1600.00
30      3      1500.00

如果想输出成deptno  sal1   sal2   sal3这种类型的格式
步骤一(decode):

select  t.deptno,decode(row_number, 1 ,sal) sal1,decode(row_number, 2 ,sal) sal2,decode(row_number, 3 ,sal) sal3  from
 (
 
select  emp. * ,row_number()  over  (partition  by  deptno  order   by  sal  desc ) row_number,   -- 1,2,3
  rank()  over  (partition  by  deptno  order   by  sal  desc ) rank,  -- 1,1,3
  dense_rank()  over  (partition  by  deptno  order   by  sal  desc ) dense_rank  from  emp  -- 1,1,2
 ) t
where  t.rank <= 3

结果如下:

10      5000         
10                    2450     
10                              1300
20      3000         
20                    3000     
20                                2975
30      2850         
30                   1600     
30                              1500

步骤二(使用聚合函数去除null,得到最终结果):

select  t.deptno, max (decode(row_number, 1 ,sal)) sal1, max (decode(row_number, 2 ,sal)) sal2, max (decode(row_number, 3 ,sal)) sal3  from
 (
 
select  emp. * ,row_number()  over  (partition  by  deptno  order   by  sal  desc ) row_number,   -- 1,2,3
  rank()  over  (partition  by  deptno  order   by  sal  desc ) rank,  -- 1,1,3
  dense_rank()  over  (partition  by  deptno  order   by  sal  desc ) dense_rank  from  emp  -- 1,1,2
 ) t
where  t.rank <= 3
group   by  t.deptno 

结果如下:

10      5000      2450      1300
20      3000      3000      2975
30      2850      1600      1500

 

 原文地址 http://blog.youkuaiyun.com/huanghui22/archive/2007/05/03/1595166.aspx

SQL分析函数 SQL分析函数 racle 分析函数——函数列表 RANK : 根据 ORDER BY 子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置 DENSE_RANK : 根据 ORDER BY 子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置 立即下载

相关推荐

Win11/Win10系统下,Proe5.0 M280终极版保姆级安装与激活指南(含SSQ补丁避坑)

本文提供Win11/Win10系统下Pro/E 5.0 M280终极版的详细安装与激活指南,涵盖环境配置、SSQ补丁应用及常见问题解决方案。通过系统调整、分步安装和性能优化,确保软件在现代操作系统上的稳定运行,特别适合机械设计用户参考。

weixin_30895059的博客 444

SQL中的分析函数

分析函数 1、聚合分析函数 SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。 avg():计算一个组和数据窗口内表达式的平均值 sum():计算组中表达式的累积和 max():在一个组中的数据窗口中查找表达式的最大值 min():在一个组中的数据窗口中查找表达式的最小值 count(): 对一组内的事务进行累积计数 2、排名分析函数 row_number()按照值排序时产生一个自增编号,不会重复(如:1、2、3、4、5、6) rank() 按照值排序时产生一个自增编号,值相等时会

春花秋月冬雪风,留得残荷听雨声。 2415

Computer Networks 和 Computer & Security投稿经验

论文投稿

qq_50604294的博客 9234

SQL分析函数,看这一篇就够了

数据库SQL分析函数/窗口函数专题,值得收藏!几乎涵盖所有数据库,例如:Oracle、Hive、MySQL8.0、MaxComputer等。企业面试中,更是钟情分析函数问...

玉皇大帝不开心 741

GEM5教程--gem5开始之旅(一)

GEM5系列教程--gem5开始之旅一、建立GEM5 GEM5模拟器是一个用于计算机系统结构研究的模块化平台,包含系统级别的结构以及处理器的微体系结构。读者若想详细的了解,请查看其官方文档GEM5文档 读者如果想要入门GEM5的话,可以参考Learning_GEM5这个网站,这里面有较为详细的教程,可以带读者从入门到精通。小编我对GEM5的入门学习也是从这个Learning_GEM5这个网站学习的...

qq_43381135的博客 3万+

STM32F103C8T6 Bootloader开发实战:串口IAP固件升级与Keil工程配置详解

本文详细介绍了STM32F103C8T6 Bootloader开发实战,重点讲解串口IAP固件升级的实现方法与Keil uVision5工程配置。通过Flash分区管理、USART1通信协议设计及应用程序跳转机制等核心技术,帮助开发者掌握嵌入式系统固件升级方案,提升设备维护效率。

weixin_29165725的博客 437

SQL数据分析常用函数

本文汇总了数据分析中处理和操作数据常用的SQL 函数,并提供了相关示例。

zwldn的博客 3626

Cocos Creator 3.x 实战:用脚本动态加载Spine动画,告别resources硬编码

本文详细介绍了Cocos Creator 3.x中Spine动画的动态加载与挂点系统实战技巧。通过Asset Bundle替代传统resources硬编码方式,实现资源的高效管理和热更新支持,同时结合TypeScript强类型和单例模式优化加载流程。文章还深入探讨了跨平台适配、挂点编程方案及性能优化策略,帮助开发者提升游戏开发效率与灵活性。

weixin_42526353的博客 267

sql中的分析函数

一 ,分析函数和聚合函数的区别 聚合函数: 1 聚合函数是能够直接使用的。 max() ,min(),avg(),count()… 2 聚合函数的计算结果返回一个值。 3 GROUP BY 分组之后,聚合函数会根据分组的字段,每一个组返回一个计算结果。 4 聚合函数若是要和其余的字段一块儿查询,那么其余的字段必须是分组的字段。 5 GROUP BY 之后,在 SELECT 后面 只能查询 被分组的字段,和聚合函数,其余的未分组的字段不容许直接查询。 6 若是表中不存在的数据,不受以上条件的约束。 分析

ths512的博客 4189

STK传感器约束设置保姆级教程:从方位角到传播延迟,手把手教你避开新手常见坑

本文详细解析了STK传感器约束设置的关键技巧,涵盖方位角、仰角、高度及传播延迟等核心参数。通过实战案例和代码示例,指导用户避开常见误区,优化卫星通信和航天任务仿真精度,特别适合STK新手和需要提升传感器配置效率的工程师。

weixin_33701294的博客 392

RouterOS v7.6实战:5分钟搞定IPv6双栈配置(含光猫桥接避坑指南)

本文详细解析了在RouterOS v7.6系统中配置IPv6双栈网络的实战步骤,特别针对家庭网络光猫桥接模式下的常见问题提供了避坑指南。文章涵盖了从基础配置到企业级部署的进阶内容,包括IPv6前缀获取、DHCPv6客户端设置、路由通告以及安全优化,帮助用户充分利用v7.6版本在IPv6支持上的改进与优势。

embedding5hiker的博客 1282

oracle分析函数汇总

1、count() over()  统计分区中各组的行数select ename,esex,eage,count(*) over() from emp; --总计数 select ename,esex,eage,count(*) over(order by eage) from emp; --递加计数 select ename,esex,eage,count(*) over(partition b...

cc_0101的博客 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Oracle]高效的SQL语句之分析函数

[Oracle]高效的SQL语句之分析函数(一)--sum() 实际应用中我们可以通过sum()统计出组中的总计或者是累加值,具体示例如下: 1.创建演示表 createtableempasselect*fromscott.emp;altertableempaddconstraintemp_pkprimarykey(empno...

weixin_33888907的博客 95

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

oracle分析函数 汇总,Oracle高效的SQL语句之分析函数汇总

如果我们按照示例想得到每个部门薪水值最高的雇员的纪录,可以有四种方法实现:先创建示例表 createtableemp as select*fromscott.emp; altertableemp addconstraintemp_pk primarykey(empno); createtabledept as select*fromscott.dept; altertabledep...

weixin_39956451的博客 172

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Oracle高效的SQL语句之分析函数汇总

小毛头的BLOG[Oracle]高效的SQL语句之分析函数(一)--sum()  实际应用中我们可以通过sum()统计出组中的总计或者是累加值,具体示例如下:1.创建演示表create table empasselect * from scott.emp;alter table empadd constraint emp_pkprimary key(empno);create 

swfcsunboy 1023

oracle 高效函数,[Oracle]高效的SQL语句之分析函数(二)

本系列文章导航[Oracle]高效的SQL语句之分析函数(一)--sum()[Oracle]高效的SQL语句之分析函数(二)--max()[Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()[Oracle]高效的SQL语句之分析函数(四)--lag()/lead()如果我们按照示例想得到每个部门薪水值最高的雇员的纪录,可以有四种方法...

weixin_29035147的博客 120

[Oracle]高效的SQL语句之分析函数(一)--sum()

 实际应用中我们可以通过sum()统计出组中的总计或者是累加值,具体示例如下:1.创建演示表create table empasselect * from scott.emp;alter table empadd constraint emp_pkprimary key(empno);create table deptasselect * from scott.dept;alter

小毛头的BLOG 1万+

[Oracle]高效的SQL语句之分析函数(一)

[Oracle]高效的SQL语句之分析函数(一)--sum() 实际应用中我们可以通过sum()统计出组中的总计或者是累加值,具体示例如下:1.创建演示表create table empasselect * from scott.emp;alter table empadd constraint emp_pkprimary key(empno);create table d

421

[Oracle]高效的SQL语句之分析函数(三)

[Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank() 有些时候我们希望得到指定数据中的前n列,示例如下: 得到每个部门薪水最高的三个雇员: 先创建...

cineqi9136的博客 87

[Oracle]高效的SQL语句之分析函数(一)(二)

[Oracle]高效的SQL语句之分析函数(一)--sum() 实际应用中我们可以通过sum()统计出组中的总计或者是累加值,具体示例如下: 1.创建演示表 createtableempasselect*...

cineqi9136的博客 114
上一篇: DWR的异常处理
下一篇: C# winform reportview
BlueSuperMan
博客等级 码龄24年 11粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值