Oracle分析函数——函数RANK,DENSE_RANK,FIRST,LAST…

RANK

功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。然而,如果两行的确得到同样的排序,则序数将随后跳跃。若两行序数为1,则没有序数2,序列将给组中的下一行分配值3,DENSE_RANK则没有任何跳跃。

SAMPLE:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与DENSE_RANK函数的区别)

DENSE_RANK

功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。密集的序列返回的时没有间隔的数

SAMPLE:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与RANK函数的区别)

select department_id, first_name || ' ' || last_name employee_name, salary, rank() over(order by salary) as rank_order, dense_rank() over(order by salary) as dense_rank_order from employees

select department_id, first_name || ' ' || last_name employee_name, salary, rank() over(partition by department_id order by salary) as rank_part_order, dense_rank() over(partition by department_id order by salary) as dense_rank_part_order from employees

FIRST

功能描述:从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录

SAMPLE:下面例子中DENSE_RANK按部门分区,再按佣金commission_pct排序,FIRST取出佣金最低的对应的所有行,然后前面的MAX函数从这个集合中取出薪水最低的值;LAST取出佣金最高的对应的所有行,然后前面的MIN函数从这个集合中取出薪水最高的值

LAST

功能描述:从DENSE_RANK返回的集合中取出排在最后面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录

SAMPLE:下面例子中DENSE_RANK按雇用日期排序,FIRST取出salary最低的对应的所有行,然后前面的MAX函数从这个集合中取出薪水最低的值;LAST取出雇用日期最高的对应的所有行,然后前面的MIN函数从这个集合中取出薪水最高的值

select department_id, first_name || ' ' || last_name employee_name, hire_date, salary, min(salary) keep(dense_rank first order by hire_date) over(partition by department_id) "Worst", max(salary) keep(dense_rank last order by hire_date) over(partition by department_id) "Best" from employees

FIRST_VALUE

功能描述:返回组中数据窗口的第一个值。

SAMPLE:下面例子计算按部门分区按薪水排序的数据窗口的第一个值对应的名字,如果薪水的第一个值有多个,则从多个对应的名字中取缺省排序的第一个名字

LAST_VALUE

功能描述:返回组中数据窗口的最后一个值。

SAMPLE:下面例子计算按部门分区按薪水排序的数据窗口的最后一个值对应的名字,如果薪水的最后一个值有多个,则从多个对应的名字中取缺省排序的最后一个名字

select department_id, first_name || ' ' || last_name employee_name, hire_date, salary, first_value(first_name || ' ' || last_name) over(partition by department_id order by salary asc) as lowest_sal, last_value(first_name || ' ' || last_name) over(partition by department_id order by salary) as highest_sal from employees

看起来last_value和first_value的标准似乎有些不一样,不过单独执行就很清楚了,呵呵

select department_id, first_name || ' ' || last_name employee_name, hire_date, salary, first_value(first_name || ' ' || last_name) over(partition by department_id order by salary) as lowest_sal, first_value(first_name || ' ' || last_name) over(partition by department_id order by salary desc) as highest_sal, last_value(first_name || ' ' || last_name) over(partition by department_id order by salary) as last_sal, last_value(first_name || ' ' || last_name) over(partition by department_id order by salary desc) as last_sal_desc from employees

LAG

功能描述:可以访问结果集中的其它行而不用进行自连接。它允许去处理游标,就好像游标是一个数组一样。在给定组中可参考当前行之前的行,这样就可以从组中与当前行一起选择以前的行。Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行),其相反的函数是LEAD

SAMPLE:下面的例子中列prev_sal返回按hire_date排序的前1行的salary值

LEAD

功能描述:LEAD与LAG相反,LEAD可以访问组中当前行之后的行。Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行)

SAMPLE:下面的例子中列prev_sal返回按hire_date排序的后1行的salary值

select first_name || ' ' || last_name employee_name, hire_date, salary, lag(salary, 1, 0) over(order by hire_date) as prev_sal, lead(salary, 1, 0) over(order by hire_date) as "next_sal" from employees

ROW_NUMBER

功能描述:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号。

SAMPLE:下例返回每个员工再在每个部门中按员工号排序后的顺序号

select department_id, first_name || ' ' || last_name employee_name, employee_id, row_number() over(partition by department_id order by employee_id) as emp_id from employees

转载于:https://www.cnblogs.com/huozhicheng/archive/2010/09/03/2533174.html

Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…相关推荐

  1. oracle 四分位函数,Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…

    Oracle 分析函数--函数RANK,DENSE_RANK,FIRST,LAST- RANK 功能描述:根据 ORDER BY 子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置.组内 ...

  2. oracle分析函数-开窗函数

    oracle分析函数 分析函数是什么? 分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. ...

  3. Oracle分析函数一——函数列表

    Oracle 分析函数 Oracle 分析函数--函数列表 SUM         : 该函数计算组中表达式的累积和 MIN         : 在一个组中的数据窗口中查找表达式的最小值 MAX    ...

  4. ORACLE 中OVER()结合rank(),dense_rank(),rownumber() 使用方法

    Oracle over函数用法   rank ( ) over ( [query_partition_clause] order_by_clause ) dense_rank ( ) over( [q ...

  5. Oracle分析函数-OLAP函数总结

    ORACLE OLAP 函数 最近这个东东用得特别多,总结了一下 .  语法: FUNCTION_NAME(,,...)    OVER() OLAP函数语法四个部分: 1.function本身 用于 ...

  6. Oracle分析函数七——函数案例

    环比 环比就是现在的统计周期和上一个统计周期比较.例如2008年7月份与2008年6月份相比较称其为环比. 环比发展速度是报告期水平与前一时期水平之比,表明现象逐期的发展速度.如计算一年内各月与前一个 ...

  7. Oracle分析函数——函数列表

    --------------聚合函数 SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于计算 ...

  8. 函数专题:sum、row_number、count、rank\dense_rank over

    来源:http://blog.csdn.net/bbliutao/article/details/7727320 一.sum over sum over主要用来对某个字段值进行逐步累加 SELECT  ...

  9. Oracle 分析函数的使用(主要是rollup用法)

        分析函数是oracle 8.1.6中就引入的一个全新的概念,为我们分析数据提供了一种简单高效的处理方式.在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语 ...

最新文章

  1. 停课不停学,大型网课直播翻车现场合集,你别笑,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈啊哈...
  2. python虚拟cpu性能_如何使用python找出CPU数量
  3. 杭电2097--Sky数
  4. Windwos Server 2016 远程桌面授权
  5. 瓜子二手车在 Dubbo 版本升级、多机房方案方面的思考和实践
  6. 关系型数据库和非关系型数据库的区别
  7. Oracle 收购Sun之后的演义:IBM 和SAP何去何从
  8. 《我也能做CTO之程序员职业规划》推荐序
  9. 《设计工作室生存手册》—第1章1.3节设计师目标要清晰
  10. mysql decimal被四舍五入_MySQL之ROUND函数四舍五入的陷阱
  11. 05 jQuery的DOM操作
  12. 【CVRP】基于matlab遗传算法求解带容量的车辆路径规划问题【含Matlab源码 162期】
  13. IE设置自动获得代理(ISA20042006中设置相应项)
  14. 一个牛人给的java九点建议
  15. 电商数仓(dwt 层)
  16. 关于PScs6无法拖入图片的解决
  17. 新视智科锂电池隔膜缺陷视觉检测系统,助力企业降本提质增效
  18. 20230429作业
  19. PaaS的五个核心价值
  20. java抢购小米手机_小米手机怎样抢购

热门文章

  1. 数据大屏产品介绍PPT_有这些图表美化工具,十分钟配出炫酷的数据可视化大屏...
  2. ReactNative-触摸事件
  3. 关于reduce中遍历2次数据的问题
  4. 深入理解Spark 2.1 Core (七):Standalone模式任务执行的原理与源码分析
  5. 数据湖之iceberg系列(一)iceberg能做什么
  6. 推荐系统rank模块-Online Learning
  7. 如何在生产环境使用Btrace进行调试
  8. 聊聊JVM(一)相对全面的GC总结
  9. MySQL数据库备份工具mysqldump的使用(转)
  10. 同实例下复制表的2种方法