oracle在分组内排序的方法,oracle 在分组内排序的方法(转载)-程序员宅基地

技术标签: oracle在分组内排序的方法  

oracle分析函数十分强大,我们只要掌握这些方法,更直接的说法就是知道这些分析函数的作用就能完成很多工作。

下边贴出这些函数,及简单应用。

其中我想对lag()和lead()函数坐下说明:lag()本身是延后的意思也就是延后出现某列的数,而lead()有引领、领先的意思也就是提前几行显示某列数据

RANK()

dense_rank()

【语法】RANK ( ) OVER ( [query_partition_clause] order_by_clause )

dense_RANK ( ) OVER ( [query_partition_clause] order_by_clause )

【功能】聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。

【参数】dense_rank与rank()用法相当,

【区别】dence_rank在并列关系是,相关等级不会跳过。rank则跳过

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

dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。

【说明】Oracle分析函数

【示例】

聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。

在9i版本之前,只有分析功能(analytic ),即从一个查询结果中计算每一行的排序值,是基于order_by_clause子句中的value_exprs指定字段的。

其语法为:

RANK ( ) OVER ( [query_partition_clause] order_by_clause )

在9i版本新增加了合计功能(aggregate),即对给定的参数值在设定的排序查询中计算出其排序值。这些参数必须是常数或常值表达式,且必须和ORDER BY子句中的字段个数、位置、类型完全一致。

其语法为:

RANK ( expr [, expr]... ) WITHIN GROUP

( ORDER BY

expr [ DESC | ASC ] [NULLS { FIRST | LAST }]

[, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...

)

例子1:

有表Table内容如下

COL1 COL2

1 1

2 1

3 2

3 1

4 1

4 2

5 2

5 2

6 2

分析功能:列出Col2分组后根据Col1排序,并生成数字列。比较实用于在成绩表中查出各科前几名的信息。

SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM table a;

结果如下:

COL1 COL2 Rank

1 1   1

2 1   2

3 1   3

4 1   4

3 2   1

4 2   2

5 2   3

5 2   3

6 2   5

例子2:

TABLE:A (科目,分数)

数学,80

语文,70

数学,90

数学,60

数学,100

语文,88

语文,65

语文,77

现在我想要的结果是:(即想要每门科目的前3名的分数)

数学,100

数学,90

数学,80

语文,88

语文,77

语文,70

那么语句就这么写:

select * from (select rank() over(partition by 科目 order by 分数 desc) rk,a.* from a) t

where t.rk<=3;

例子3:

合计功能:计算出数值(4,1)在Orade By Col1,Col2排序下的排序值,也就是col1=4,col2=1在排序以后的位置

SELECT RANK(4,3) WITHIN GROUP (ORDER BY col1,col2) "Rank" FROM table;

结果如下:

Rank

4

dense_rank与rank()用法相当,但是有一个区别:dence_rank在并列关系是,相关等级不会跳过。rank则跳过

例如:表

A      B      C

a     liu     wang

a     jin     shu

a     cai     kai

b     yang     du

b     lin     ying

b     yao     cai

b     yang     99

例如:当rank时为:

select m.a,m.b,m.c,rank() over(partition by a order by b) liu from test3 m

A     B       C     LIU

a     cai      kai     1

a     jin      shu     2

a     liu      wang     3

b     lin      ying     1

b     yang     du      2

b     yang     99      2

b     yao      cai     4

而如果用dense_rank时为:

select m.a,m.b,m.c,dense_rank() over(partition by a order by b) liu from test3 m

A     B       C     LIU

a     cai     kai     1

a     jin     shu     2

a     liu     wang     3

b     lin     ying     1

b     yang     du      2

b     yang     99      2

b     yao     cai     3 ROW_NUMBER()

【语法】ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)

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

row_number() 返回的主要是“行”的信息,并没有排名

【参数】

【说明】Oracle分析函数

主要功能:用于取前几名,或者最后几名等

【示例】

表内容如下:

name | seqno | description

A | 1 | test

A | 2 | test

A | 3 | test

A | 4 | test

B | 1 | test

B | 2 | test

B | 3 | test

B | 4 | test

C | 1 | test

C | 2 | test

C | 3 | test

C | 4 | test

我想有一个sql语句,搜索的结果是

A | 1 | test

A | 2 | test

B | 1 | test

B | 2 | test

C | 1 | test

C | 2 | test

实现:

select name,seqno,description

from(select name,seqno,description,row_number() over (partition by name order by seqno) id

from table_name) where id<=3;

lag()和lead()

【语法】

lag(EXPR,,)

LEAD(EXPR,,)

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

lead () 下一个值 lag() 上一个值

【参数】

EXPR是从其他行返回的表达式

OFFSET是缺省为1 的正数,表示相对行数。希望检索的当前行分区的偏移量

DEFAULT是在OFFSET表示的数目超出了分组的范围时返回的值。

【说明】Oracle分析函数

【示例】

-- Create table

create table LEAD_TABLE

(

CASEID VARCHAR2(10),

STEPID VARCHAR2(10),

ACTIONDATE DATE

)

tablespace COLM_DATA

pctfree 10

initrans 1

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

);

insert into LEAD_TABLE values('Case1','Step1',to_date('20070101','yyyy-mm-dd'));

insert into LEAD_TABLE values('Case1','Step2',to_date('20070102','yyyy-mm-dd'));

insert into LEAD_TABLE values('Case1','Step3',to_date('20070103','yyyy-mm-dd'));

insert into LEAD_TABLE values('Case1','Step4',to_date('20070104','yyyy-mm-dd'));

insert into LEAD_TABLE values('Case1','Step5',to_date('20070105','yyyy-mm-dd'));

insert into LEAD_TABLE values('Case1','Step4',to_date('20070106','yyyy-mm-dd'));

insert into LEAD_TABLE values('Case1','Step6',to_date('20070101','yyyy-mm-dd'));

insert into LEAD_TABLE values('Case1','Step1',to_date('20070201','yyyy-mm-dd'));

insert into LEAD_TABLE values('Case2','Step2',to_date('20070202','yyyy-mm-dd'));

insert into LEAD_TABLE values('Case2','Step3',to_date('20070203','yyyy-mm-dd'));

commit;

结果如下:

Case1 Step1 2007-1-1 Step2 2007-1-2

Case1 Step2 2007-1-2 Step3 2007-1-3 Step1 2007-1-1

Case1 Step3 2007-1-3 Step4 2007-1-4 Step2 2007-1-2

Case1 Step4 2007-1-4 Step5 2007-1-5 Step3 2007-1-3

Case1 Step5 2007-1-5 Step4 2007-1-6 Step4 2007-1-4

Case1 Step4 2007-1-6 Step6 2007-1-7 Step5 2007-1-5

Case1 Step6 2007-1-7 Step4 2007-1-6

Case2 Step1 2007-2-1 Step2 2007-2-2

Case2 Step2 2007-2-2 Step3 2007-2-3 Step1 2007-2-1

Case2 Step3 2007-2-3 Step2 2007-2-2

还可以进一步统计一下两者的相差天数

select caseid,stepid,actiondate,nextactiondate,nextactiondate-actiondate datebetween from (

select caseid,stepid,actiondate,lead(stepid) over (partition by caseid order by actiondate) nextstepid,

lead(actiondate) over (partition by caseid order by actiondate) nextactiondate,

lag(stepid) over (partition by caseid order by actiondate) prestepid,

lag(actiondate) over (partition by caseid order by actiondate) preactiondate

from lead_table)

结果如下:

Case1 Step1 2007-1-1 2007-1-2 1

Case1 Step2 2007-1-2 2007-1-3 1

Case1 Step3 2007-1-3 2007-1-4 1

Case1 Step4 2007-1-4 2007-1-5 1

Case1 Step5 2007-1-5 2007-1-6 1

Case1 Step4 2007-1-6 2007-1-7 1

Case1 Step6 2007-1-7

Case2 Step1 2007-2-1 2007-2-2 1

Case2 Step2 2007-2-2 2007-2-3 1

Case2 Step3 2007-2-3

每一条记录都能连接到上/下一行的内容

lead () 下一个值 lag() 上一个值

select caseid,stepid,actiondate,lead(stepid) over (partition by caseid order by actiondate) nextstepid,lead(actiondate) over (partition by caseid order by actiondate) nextactiondate,lag(stepid) over (partition by caseid order by actiondate) prestepid,lag(actiondate) over (partition by caseid order by actiondate) preactiondatefrom lead_table

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33881426/article/details/116540820

智能推荐

怎么实现跨域?配置vue跨域proxy,jsonp跨域很简单-程序员宅基地

文章浏览阅读760次,点赞10次,收藏28次。/ 封装axios请求的模块// 用axios重新生成了请求的实例baseURL: ‘’, // 项目发送axios请求的公共地址 值为空timeout: 5000 // 请求超时时间 这里是请求超过五秒后还没有获得请求结果 提示请求超时})// config包含了请求相关的所有信息// 可以同过config对象给请求配置或者修改信息return config // 将配置完成的token返回 如果不返回 请求不会继续进行// 请求发生错误时的回调函数。

兼容Office和WPS中Word图标库_wps officeimageid-程序员宅基地

文章浏览阅读108次。最近在用c#写VSTO文字操作插件,因为要同时在WPS中有效,因此进行了提取。_wps officeimageid

Kali Linux 解决Wine下中文或英文字体乱码的问题 ,一劳永逸法 。_kali wine 中文方块-程序员宅基地

文章浏览阅读4k次,点赞11次,收藏14次。  解决 Kali Linux中 Wine下英文方块乱码的方法  最近在wine下使用notepad++和sublime编辑器的时候,发现英文全部均是方块乱码,熟悉wine的朋友们一定会记得,在.wine文件夹下模拟器的文件结构是和Windows是非常相似的: nautilus .wine/drive_c/  wine中文件结构:  Windows下文件结构:  如果,我们分别在Linux终端下对.wine/drive_c和在Powershell终端对C盘进行tree查看,就会发现文件是高_kali wine 中文方块

Vue.js的双向绑定原理-程序员宅基地

文章浏览阅读285次。vue3双向绑定原理

高效生产管理:选择顺通鞋厂ERP系统派单的理由-程序员宅基地

文章浏览阅读804次,点赞26次,收藏17次。然而,传统的生产管理模式已经难以满足现代企业的需求,因此选择一款适合自身业务特点的生产管理软件成为了企业的当务之急。顺通鞋业ERP系统的派单功能具备强大的数据分析能力,能够为企业提供全面的生产数据报表。ERP系统的派单功能作为高效生产管理的解决方案,企业将获得实时监控、简化流程、智能分析、灵活配置、安全可靠和优质服务等多方面的优势。显然,传统的生产管理模式已经难以满足现代企业的需求,因此选择一款适合自身业务特点的生产管理软件成为了企业的当务之急。ERP系统的派单功能将成为企业实现高效生产管理的有力武器。

COMSOL光电、FDTD光学器件超表面、TCAD半导体器件仿真技术与应用直播学习_comsol与tcad仿真能结合起来吗-程序员宅基地

文章浏览阅读362次。Ø 散射边界和端口边界的使用方法和技巧(波失方向和极化方向设置、S参数、反射率和透射率的计算和提取、高阶衍射通道反射投射效率的计算)Ø COMSOL WITH MATLAB 进行复杂的物理场或者集合模型的建立(如超表面波前的衍射计算)Ø COMSOL WITH MATLAB 进行复杂函数的设置(如石墨烯电导函数的设置和仿真)Ø 热电子光探测器的电磁场空间分布与FDTD材料折射率的导出(脚本计算不同金属层的吸收)Ø 利用S参数分析组并通过脚本实现金属纳米小球的吸收/散射消光与近场增强的计算。_comsol与tcad仿真能结合起来吗

随便推点

微信h5页面打开微信内置地图及wx.openLocation回调成功调不起页面的问题_h5 wx.openlocation-程序员宅基地

文章浏览阅读4.5k次。先说下需求吧,我们的需求是通过一个经纬度,然后打开微信内置的地图页面代码如下://导航到停车场 gogogo() { //获取当前页面url //var url = location.href.split('#')[0]; // alert(11111) // window.location.href = // "https://apis.map.qq.com/uri/v1/marker?marker=coord:30.595810_h5 wx.openlocation

Linux——部署DNS服务二: 正向解析,反向解析,双向解析_用于减少域名到ip地址的映射的技术是-程序员宅基地

文章浏览阅读616次。一、DNS正向解析(权威配置) 作用: 用于域名到IP地址的映射,当DNS客户端请求解析某个域名时,DNS服务器通过正向查找,并返回给DNS客户端对应的IP地址 正向解析的部署:删除forwarders { 114.114.114.114; };(或者注释掉)vim /etc/named.rfc1912.zones新添加一个zone(可以复制19到23行,粘贴在底下再进行修改..._用于减少域名到ip地址的映射的技术是

学习使用idea搭建SSH框架,并实现一个简单的登录功能_intellij idea ssh 登录系统教程-程序员宅基地

文章浏览阅读2.2k次。学习利用Struts2,Spring,Hibernate这三个框架来搭建项目的主体架构,实现简单的一个登录注册功能_intellij idea ssh 登录系统教程

Golang编译选项(ldflags)有趣应用_golang ldflags-程序员宅基地

文章浏览阅读1.6k次。本文介绍了git提交日志,如何在构建时给Go程序增加信息,如GIT提交日志、编译时间等信息。最后还顺便介绍了压缩可执行文件的选项。_golang ldflags

WPF基础到企业应用系列6——布局全接触-程序员宅基地

文章浏览阅读88次。本文转自:http://knightswarrior.blog.51cto.com/1792698/365351一. 摘要首先很高兴这个系列能得到大家的关注和支持,这段时间一直在研究Windows Azure,所以暂缓了更新,同时也本着想把它写好、宁缺毋滥的精神,在速度上自然也就慢了下来,这篇文章拖拖拉拉也经历了十多天才发布出来(每天写一 点),不过请大家放心,这个系列一定会继续写下去。由..._c#的 uniformgrid x:name="wrappanel

关于深度学习人工智能模型的探讨(二)(1)_深度学习可以用不完备性定理解释么-程序员宅基地

文章浏览阅读175次。第二章 不完备性定理2.1 一剑封喉1931年,希尔伯特先生刚刚退休,清闲了没几天。有一个叫哥德尔的小混混找上门来,仅仅用了一招。仅此一招,一剑封喉,就击败了武林大盟主希尔伯特。当年哥德尔粉碎希尔伯特梦想的,是一个简洁漂亮的小证明。当这个小小的证明一横空出世,就电闪雷鸣万道金光,对雄心勃勃的数学界来说更彷如晴天霹雳,宣判了希尔伯特纲领的彻底破产。真是令人沮丧,哥德尔不完全性定理一举粉碎了..._深度学习可以用不完备性定理解释么

推荐文章

热门文章

相关标签