不知道各位有没有这种感觉,总是听别人说 Oracle 很强大,但是,一直体会不到。用小沈阳的话说,
这是,为什么呢?
其实,主要是学涯时期,个人对于技术接触的面太窄了。实习期间才了解到 Oracle数据库的强大之处,真是相见恨晚啊,,,
博文主角:row_number() / over()
- row_number() 从1开始,为每一条分组记录返回一个数字
- over() 开窗函数
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
- 1:写法:
- over(order by salary) 按照salary排序进行累计
- over(partition by deptno) 按照部门分区
- over(partition by deptno order by salary)
- 2:窗口范围:
- over(order by salaryrangebetween 5 preceding and 5 following) 窗口范围为当前行数据幅度减5加5后的范围内的。
- over(order by salaryrowsbetween 5 preceding and 5 following) 窗口范围为当前行前后各移动5行等。
- 3:常与over函数结合使用的函数
- row_number()
- rank()
- dense_rank()
由于相关使用的博文有很多,所以这里就不再赘述。仅给出相关的引导,感兴趣的可以继续参考、实验、深化。
row_number() 函数与over()函数之间的联姻
- 语法:
- ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)
- 简单应用:
- row_number() over() 执行结果:
- 结果解释:
- partition:分组根据 x 进行分组
- order by:根据 y 进行排序,注意是在分组内排序!
- 额外知识:
- 在使用 row_number() over()函数时候,如果后面有where条件,over() 里头的分组以及排序的执行晚于 where group by order by 的执行。
- partition by 是数据的分区取数,用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。
- SQL Server中也存在类似的用法,应该是从2005版本开始的,读者感兴趣的可以自己探索。
- 相关博文:
最后,可能文章写的有点杂乱,涉及的知识也比较宽泛,读者可以根据自己的兴趣参考,当然我的用意是有助于扩展知识面,使读者了解的更加广泛。谢谢 !