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()是连续排序,有两个第二名时仍然跟着第三名
|
使用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会。
over(partition by col)函数在PL/SQL中提供快速去重功能,对比distinct和group by,它能更快地按特定列分组。通过结合row_num挑选每组第一条记录,实现去重效果。此外,over (partition by col1)允许不依赖所有输出字段进行分组,解决了group by的限制,保持了相同元组的独立性。

4813

被折叠的 条评论
为什么被折叠?



