PL/SQL函数 over(partition by col)

row_number() OVER (PARTITION BY COL1 ORDER BY COL2)  表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.
row_number(),rank(),dense_rank()后面都是跟 over(partition by col1 order by col2)三者的区别在于:
1.row_number()得到的结果在同组内没有重复的数字;
2.rank()和dense_rank()的区别是:
--rank()是跳跃排序,有两个第二名时接下来就是第四名
--dense_rank()是连续排序,有两个第二名时仍然跟着第三名
其中row_number() OVER 效果如下:
PL/SQL函数 over(partition by col)_第1张图片

使用over这个函数去重的效果比,distinct,group by 速度会快很多,因为over这个函数可以只看根据其中的几个属性分组,distinct和group by则不然。

在以上例子中,只要在sql外加一层select * from (以上sql) where row_num =1 则,能够挑出每组第一个,间接实现去重。


继续说一下over (partition by col1)这个函数,这个函数弥补了使用group by做聚集函数的时候,必须将所有输出摆在group by后面的不足,使用over (partition by col1)函数,我们就可以只按照几个输出字段进行分组,而不必按照所有输出字段。使用如下:

over (partition by col1) 和 group by 不同的是,over (partition by col1)不会将相同的元组合并,但是group by会。


你可能感兴趣的:(plsql)