Oracle各类序号函数详解

Oracle提供的序号函数:

1、rownum

rownum为最简单的序号 但是在order by之前就确定值。

举例:

select
rownum,--序号
year_name,--年份名称
month_name,--月份名称
post_code,--岗位编码
post_name,--岗位名称
testtype_code,--试验类型编码
testtype_name,--试验类型名称
cost_amt--产值
from test_2021
where year_name = '2016年'
and month_name = '12月'
order by cost_amt

执行结果如下:

行号序号年份名称月份名称岗位编码岗位名称试验类型编码试验类型名称产值
172016年12月6微波器件检测岗2复验22
232016年12月5分立器件检测岗2复验76
312016年12月4阻容元件检测岗1筛选214
452016年12月7电连接器器件检测岗2复验488
562016年12月8机电元件检测岗2复验488
642016年12月6微波器件检测岗1筛选633
782016年12月5分立器件检测岗1筛选817
892016年12月8机电元件检测岗1筛选817
922016年12月4阻容元件检测岗2复验870

由此可见序号是在order by 产值之前就已经确定的。

2、row_number()
2.1、row_number() over( order by 字段名1,字段名2,…字段名n )

先排序再确定序号

举例:

select
row_number() over( order by  cost_amt)  as xuhao,--序号
year_name,--年份名称
month_name,--月份名称
post_code,--岗位编码
post_name,--岗位名称
testtype_code,--试验类型编码
testtype_name,--试验类型名称
cost_amt--产值
from test_2021 a
where year_name = '2016年'

执行结果如下:

行号序号年份名称月份名称岗位编码岗位名称试验类型编码试验类型名称产值
112016年12月6微波器件检测岗2复验22
222016年11月7电连接器器件检测岗2复验57
332016年12月5分立器件检测岗2复验76
442016年12月4阻容元件检测岗1筛选214
552016年11月6微波器件检测岗1筛选388
662016年11月4阻容元件检测岗2复验391
772016年12月7电连接器器件检测岗2复验488
882016年12月8机电元件检测岗2复验488
992016年12月6微波器件检测岗1筛选633
10102016年11月8机电元件检测岗1筛选640
11112016年11月5分立器件检测岗2复验795
12122016年11月6微波器件检测岗2复验802
13132016年12月8机电元件检测岗1筛选817
14142016年12月5分立器件检测岗1筛选817
15152016年12月4阻容元件检测岗2复验870
16162016年11月5分立器件检测岗1筛选874
17172016年11月8机电元件检测岗2复验874

由此可见序号是在 order by 排序之后产生的。

2.2、row_number() over(partition by 字段名1,字段名2,…字段名n order by 字段名1,字段名2,…字段名n )

先排序再确定序号,会根据 partition 分区,在每一个小分区内部取序号

举例:

select
row_number() over(partition by month_name order by  cost_amt)  as xuhao,--序号
year_name,--年份名称
month_name,--月份名称
post_code,--岗位编码
post_name,--岗位名称
testtype_code,--试验类型编码
testtype_name,--试验类型名称
cost_amt--产值
from test_2021 a
where year_name = '2016年'

执行结果如下:

行号序号年份名称月份名称岗位编码岗位名称试验类型编码试验类型名称产值
112016年11月7电连接器器件检测岗2复验57
222016年11月6微波器件检测岗1筛选388
332016年11月4阻容元件检测岗2复验391
442016年11月8机电元件检测岗1筛选640
552016年11月5分立器件检测岗2复验795
662016年11月6微波器件检测岗2复验802
772016年11月8机电元件检测岗2复验874
882016年11月5分立器件检测岗1筛选874
992016年11月4阻容元件检测岗1筛选884
1012016年12月6微波器件检测岗2复验22
1122016年12月5分立器件检测岗2复验76
1232016年12月4阻容元件检测岗1筛选214
1342016年12月8机电元件检测岗2复验488
1452016年12月7电连接器器件检测岗2复验488
1562016年12月6微波器件检测岗1筛选633
1672016年12月8机电元件检测岗1筛选817
1782016年12月5分立器件检测岗1筛选817
1892016年12月4阻容元件检测岗2复验870

由此可见序号是在 order by 排序之后产生的,且11月份和12月份在不同的分区,所以会有单独的排序。

3、rank()

rank()和row_number() 函数用法类似,及与**over( order by 字段名1,字段名2,…字段名n )row_number() over(partition by 字段名1,字段名2,…字段名n order by 字段名1,字段名2,…字段名n )**结合使用,但是rank()生成的序号是同值同序的不连续序号,即如果出现相同的值,那么序号是一样的。

3.1、rank() over( order by 字段名1,字段名2,…字段名n )

先排序,再生成序号,遇到重复的值,序号是一样的,且会占据一个位置,比如,两个1,下个就是3。

举例:

select
rank() over(order by  cost_amt)  as xuhao,--序号
year_name,--年份名称
month_name,--月份名称
post_code,--岗位编码
post_name,--岗位名称
testtype_code,--试验类型编码
testtype_name,--试验类型名称
cost_amt--产值
from test_2021 a
where year_name = '2016年'

执行结果如下:

行号序号年份名称月份名称岗位编码岗位名称试验类型编码试验类型名称产值
112016年12月6微波器件检测岗2复验22
222016年11月7电连接器器件检测岗2复验57
332016年12月5分立器件检测岗2复验76
442016年12月4阻容元件检测岗1筛选214
552016年11月6微波器件检测岗1筛选388
662016年11月4阻容元件检测岗2复验391
772016年12月7电连接器器件检测岗2复验488
872016年12月8机电元件检测岗2复验488
992016年12月6微波器件检测岗1筛选633
10102016年11月8机电元件检测岗1筛选640
11112016年11月5分立器件检测岗2复验795
12122016年11月6微波器件检测岗2复验802
13132016年12月8机电元件检测岗1筛选817
14132016年12月5分立器件检测岗1筛选817
15152016年12月4阻容元件检测岗2复验870
16162016年11月5分立器件检测岗1筛选874
17162016年11月8机电元件检测岗2复验874
18182016年11月4阻容元件检测岗1筛选884

以上例子中,第七行和第八行的值都是488,所以序号都是7,下一个就是9。

3.2、rank() over(partition by 字段名1,字段名2,…字段名n order by 字段名1,字段名2,…字段名n )

先排序再确定序号,会根据 partition 分区,在每一个小分区内部取序号,序号同值同序不连续

举例:

select
rank() over(partition by month_name order by  cost_amt)  as xuhao,--序号
year_name,--年份名称
month_name,--月份名称
post_code,--岗位编码
post_name,--岗位名称
testtype_code,--试验类型编码
testtype_name,--试验类型名称
cost_amt--产值
from test_2021 a
where year_name = '2016年'

执行结果如下:

行号序号年份名称月份名称岗位编码岗位名称试验类型编码试验类型名称产值
112016年11月7电连接器器件检测岗2复验57
222016年11月6微波器件检测岗1筛选388
332016年11月4阻容元件检测岗2复验391
442016年11月8机电元件检测岗1筛选640
552016年11月5分立器件检测岗2复验795
662016年11月6微波器件检测岗2复验802
772016年11月8机电元件检测岗2复验874
872016年11月5分立器件检测岗1筛选874
992016年11月4阻容元件检测岗1筛选884
1012016年12月6微波器件检测岗2复验22
1122016年12月5分立器件检测岗2复验76
1232016年12月4阻容元件检测岗1筛选214
1342016年12月8机电元件检测岗2复验488
1442016年12月7电连接器器件检测岗2复验488
1562016年12月6微波器件检测岗1筛选633
1672016年12月8机电元件检测岗1筛选817
1772016年12月5分立器件检测岗1筛选817
1892016年12月4阻容元件检测岗2复验870
4、dense_rank()

dense_rank()与rank()的区别在于,dense_rank()生成的序号是连续的。

4.1、dense_rank() over( order by 字段名1,字段名2,…字段名n )

举例:

select
dense_rank() over(order by  cost_amt)  as xuhao,--序号
year_name,--年份名称
month_name,--月份名称
post_code,--岗位编码
post_name,--岗位名称
testtype_code,--试验类型编码
testtype_name,--试验类型名称
cost_amt--产值
from test_2021 a
where year_name = '2016年'

执行结果如下:

行号序号年份名称月份名称岗位编码岗位名称试验类型编码试验类型名称产值
112016年12月6微波器件检测岗2复验22
222016年11月7电连接器器件检测岗2复验57
332016年12月5分立器件检测岗2复验76
442016年12月4阻容元件检测岗1筛选214
552016年11月6微波器件检测岗1筛选388
662016年11月4阻容元件检测岗2复验391
772016年12月7电连接器器件检测岗2复验488
872016年12月8机电元件检测岗2复验488
982016年12月6微波器件检测岗1筛选633
1092016年11月8机电元件检测岗1筛选640
11102016年11月5分立器件检测岗2复验795
12112016年11月6微波器件检测岗2复验802
13122016年12月8机电元件检测岗1筛选817
14122016年12月5分立器件检测岗1筛选817
15132016年12月4阻容元件检测岗2复验870
16142016年11月5分立器件检测岗1筛选874
17142016年11月8机电元件检测岗2复验874
18152016年11月4阻容元件检测岗1筛选884
4.2、dense_rank() over(partition by 字段名1,字段名2,…字段名n order by 字段名1,字段名2,…字段名n )

举例:

select
dense_rank() over(partition by month_name order by  cost_amt)  as xuhao,--序号
year_name,--年份名称
month_name,--月份名称
post_code,--岗位编码
post_name,--岗位名称
testtype_code,--试验类型编码
testtype_name,--试验类型名称
cost_amt--产值
from test_2021 a
where year_name = '2016年'

执行结果如下:

行号序号年份名称月份名称岗位编码岗位名称试验类型编码试验类型名称产值
112016年11月7电连接器器件检测岗2复验57
222016年11月6微波器件检测岗1筛选388
332016年11月4阻容元件检测岗2复验391
442016年11月8机电元件检测岗1筛选640
552016年11月5分立器件检测岗2复验795
662016年11月6微波器件检测岗2复验802
772016年11月8机电元件检测岗2复验874
872016年11月5分立器件检测岗1筛选874
982016年11月4阻容元件检测岗1筛选884
1012016年12月6微波器件检测岗2复验22
1122016年12月5分立器件检测岗2复验76
1232016年12月4阻容元件检测岗1筛选214
1342016年12月8机电元件检测岗2复验488
1442016年12月7电连接器器件检测岗2复验488
1552016年12月6微波器件检测岗1筛选633
1662016年12月8机电元件检测岗1筛选817
1762016年12月5分立器件检测岗1筛选817
1872016年12月4阻容元件检测岗2复验870
总结:
select
rownum as xuhao1,/*order by 之前生成的序号*/
row_number() over(order by  cost_amt)  xuhao2,/*先排序 然后生成连续序号*/
row_number() over(partition by month_name order by  cost_amt)  as xuhao3,/*先分区 再排序 然后生成连续序号*/
rank() over(order by  cost_amt)  as xuhao4,/*先排序 然后生成同值同序不连续序号*/
rank() over(partition by month_name order by  cost_amt)  as xuhao5,/*先分区 再排序 然后生成同值同序不连续序号*/
dense_rank() over(order by  cost_amt)  as xuhao6,/*先排序 然后生成同值同序连续序号*/
dense_rank() over(partition by month_name order by  cost_amt)  as xuhao7,/*先分区 再排序 然后生成同值同序连续序号*/
year_name,--年份名称
month_name,--月份名称
post_code,--岗位编码
post_name,--岗位名称
testtype_code,--试验类型编码
testtype_name,--试验类型名称
cost_amt--产值
from test_2021 a
where year_name = '2016年'

执行结果如下:

序号1序号2序号3序号4序号5序号6序号7年份名称月份名称岗位编码岗位名称试验类型编码试验类型名称产值
91111112016年12月6微波器件检测岗2复验22
122121212016年11月7电连接器器件检测岗2复验57
43232322016年12月5分立器件检测岗2复验76
14343432016年12月4阻容元件检测岗1筛选214
145252522016年11月6微波器件检测岗1筛选388
136363632016年11月4阻容元件检测岗2复验391
77574742016年12月7电连接器器件检测岗2复验488
88474742016年12月8机电元件检测岗2复验488
59696852016年12月6微波器件检测岗1筛选633
10104104942016年11月8机电元件检测岗1筛选640
151151151052016年11月5分立器件检测岗2复验795
61261261162016年11月6微波器件检测岗2复验802
161381371262016年12月5分立器件检测岗1筛选817
181471371262016年12月8机电元件检测岗1筛选817
31591591372016年12月4阻容元件检测岗2复验870
171671671472016年11月8机电元件检测岗2复验874
111781671472016年11月5分立器件检测岗1筛选874
21891891582016年11月4阻容元件检测岗1筛选884
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值