数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

深入探讨:oracle中row


发布日期:2020年03月26日
 
深入探讨:oracle中row
row_number()over(partition by col order by col)表示根据col分组在分组内部根据col排序而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

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

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

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

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

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

语法格式:

row_number() over (order by col_[col_ ])

作用:按照col_[col_ ]排序返回排序后的结果集

此用法有点像rownum为每一行返回一个不相同的值

复制代码 代码如下:

select rownumenamejob

row_number() over (order by rownum) row_number

from emp;

ROWNUM ENAME JOB ROW_NUMBER

SMITH CLERK

ALLEN SALESMAN

WARD SALESMAN

JONES MANAGER

MARTIN SALESMAN

BLAKE MANAGER

CLARK MANAGER

SCOTT ANALYST

KING PRESIDENT

TURNER SALESMAN

ADAMS CLERK

JAMES CLERK

FORD ANALYST

MILLER CLERK

如果没有partition by子句 结果集将是按照order by 指定的列进行排序

复制代码 代码如下:

with row_number_test as(

select atwenty two b from dual union all

select one from dual union all

select thirteen from dual union all

select five from dual union all

select four from dual)

select ab

row_number() over (order by b)

from row_number_test

order by a;

正如我们所期待的row_number()返回按照b列排序的结果

然后再按照a进行排序才得到下面的结果:

复制代码 代码如下:

A B ROW_NUMBER()OVER(ORDERBYB)

one

four

five

thirteen

twenty two

row_number() over (partition by col_n[col_m ] order by col_[col_ ])

作用:先按照col_n[col_m 进行分组

再在每个分组中按照col_[col_ ]进行排序(升序)

最后返回排好序后的结果集:

复制代码 代码如下:

with row_number_test as(

select atwenty two b* c from dual union all

select one+ from dual union all

select thirteen* from dual union all

select five+ from dual union all

select four+ from dual)

select ab

row_number() over (partition by c order by b) row_number

from row_number_test

order by a;

这个例子中我们先按照c列分组分为组(*+组)

再按照每个小组的b列进行排序(按字符串首字母的ascii码排)

最后按照a列排序得到下面的结果集:

复制代码 代码如下:

A B ROW_NUMBER

one

four

five

thirteen

twenty two

               

上一篇:oracle存储过程创建表分区实例

下一篇:分区和负载均衡让MySQL更大更好