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

来源:互联网 发布:ubuntu 14.04 32下载 编辑:程序博客网 时间:2024/05/29 08:50
1,RANK(总结:下图中出现了两个2,就没有序列3了)
功能描述:根据 ORDER BY 子句中表达式的值,从查询返回的每一行,计算它们与其它行的
相对位置。组内的数据按 ORDER BY 子句排序,然后给每一行赋一个号,从而形成一个序列,
该序列从 1 开始,往后累加。每次 ORDER BY 表达式的值发生变化时,该序列也随之增加。
有同样值的行得到同样的数字序号(认为 null 时相等的)。然而,如果两行的确得到同样的
排序,则序数将随后跳跃

2,DENSE_RANK(总结:序号不跳跃,出现并排第二,并排第三等)
功能描述:根据 ORDER BY 子句中表达式的值,从查询返回的每一行,计算它们与其它行的
相对位置。组内的数据按 ORDER BY 子句排序,然后给每一行赋一个号,从而形成一个序列,
该序列从 1 开始,往后累加。每次 ORDER BY 表达式的值发生变化时,该序列也随之增加。
有同样值的行得到同样的数字序号(认为 null 时相等的)。密集的序列返回的时没有间隔的
数。
-----------------------------------------------------------------------
例子:
1,下例中计算每个员工按薪水排序
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 HR.EMPLOYEES

2,计算每个员工按部门分区再按薪水排序
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 HR.EMPLOYEES

注意点:
1,是以一个部门为一组,然后在按薪酬来排名,
2,rank() 是有跳跃的
3,dense_rank()是没有跳跃的
----------------------------------------------------------------------------------------------------------------
3,FIRST
功能描述:从 DENSE_RANK 返回的集合中取出排在最前面的一个值的行(可能多行,因为
值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录

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

例子:
DENSE_RANK 按部门分区,再按佣金 commission_pct 排序,FIRST 取
出佣金最低的对应的所有行,然后前面的 MAX 函数从这个集合中取出薪水最低的值;LAST
取出佣金最高的对应的所有行,然后前面的 MIN 函数从这个集合中取出薪水最高的值
SELECT DEPARTMENT_ID,
FIRST_NAME || ' ' || LAST_NAME EMPLOYEE_NAME,
HIRE_DATE,
SALARY,
MAX(SALARY) KEEP(DENSE_RANK FIRST ORDER BY HIRE_DATE) OVER(PARTITION BY DEPARTMENT_ID) "WORST",
MIN(SALARY) KEEP(DENSE_RANK LAST ORDER BY HIRE_DATE) OVER(PARTITION BY DEPARTMENT_ID) "BEST"
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID = 30--便于分析取部门为30的员工,以HIRE_DATE做升序
ORDER BY HIRE_DATE ASC


注意点:
1,DENSE_RANK 按部门分区(PARTITION BY DEPARTMENT_ID)
2 ,KEEP (DENSE_RANK FIRST ORDER BY hire_date) 按HIRE_DATE做升序
3,MAX(SALARY)是为DENSE_RANK 返回的集合中取出排在最前面的HIRE_DATE是有多行,在这个集合中选最大的SALARY
4,MIN(SALARY)是为DENSE_RANK 返回的集合中取出排在最后面的HIRE_DATE是有多行,在这个集合中选最小的SALARY

阅读全文
0 0
原创粉丝点击