row_number() 、over()函数小结(Oracle)

来源:互联网 发布:淘宝特惠群怎么赚钱 编辑:程序博客网 时间:2024/06/08 00:56

   不知道各位有没有这种感觉,总是听别人说 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 salary range between 5 preceding and 5 following) 窗口范围为当前行数据幅度减5加5后的范围内的。
      • over(order by salary rows between 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)
  • 简单应用:
-- 在 Oracle 中创建 employee表create table employee (empid int ,deptid int ,salary decimal(10,2));-- 插入员工信息 (2 种方法)insert into employee values(1,10,5500.00);insert into employee values(2,10,4500.00);insert into employee values(3,20,1900.00);insert into employee values(4,20,4800.00);insert into employee values(5,40,6500.00);insert into employee values(6,40,14500.00);insert into employee values(7,40,44500.00);insert into employee values(8,50,6500.00);insert into employee values(9,50,7500.00);COMMIT;-- 删除employee 表中的数据-- DELETE FROM employee;-- 批量插入数据-- 启发拓展:mysql批量插入数据/*INSERT INTO employee        SELECT 1,10,5500.00 FROM dual       UNION ALL SELECT 1,10,5500.00 FROM dual       UNION ALL SELECT 2,10,4500.00 FROM dual       UNION ALL SELECT 3,20,1900.00 FROM dual       UNION ALL SELECT 4,20,4800.00 FROM dual       UNION ALL SELECT 5,40,6500.00 FROM dual       UNION ALL SELECT 6,40,14500.00 FROM dual       UNION ALL SELECT 5,40,6500.00 FROM dual       UNION ALL SELECT 5,40,6500.00 FROM dual       UNION ALL SELECT 7,40,44500.00 FROM dual       UNION ALL SELECT 8,50,6500.00 FROM dual         UNION ALL SELECT 9,50,7500.00 FROM dualCOMMIT;*/-- 查询 employee表中的数据SELECT * FROM employee;-- ROW_NUMBER() OVER() 函数SELECT e.*, ROW_NUMBER() OVER(PARTITION BY DEPTID ORDER BY SALARY DESC) RANK  FROM EMPLOYEE e;

  • row_number() over() 执行结果:

执行结果

  • 结果解释:
    • partition:分组根据 x 进行分组
    • order by:根据 y 进行排序,注意是在分组内排序!

  • 额外知识:
    • 在使用 row_number() over()函数时候,如果后面有where条件,over() 里头的分组以及排序的执行晚于 where group by order by 的执行。
    • partition by 是数据的分区取数,用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。
    • SQL Server中也存在类似的用法,应该是从2005版本开始的,读者感兴趣的可以自己探索。
    • 批量插入数据相关博文:http://blog.csdn.net/qq_24452475/article/details/52503493

  • 相关博文:
    • 推荐:http://blog.csdn.net/631799/article/details/7419797#
    • 次之:http://www.cnblogs.com/fxgachiever/archive/2010/09/15/1826792.html
    • 在分页中的作用:http://www.xuehuile.com/blog/1f57a50bfa0b421e8bd69ee38b4a5050.html

  最后,可能文章写的有点杂乱,涉及的知识也比较宽泛,读者可以根据自己的兴趣参考,当然我的用意是有助于扩展知识面,使读者了解的更加广泛。谢谢 !

0 0
原创粉丝点击