分析函数学习(二)-->>排名函数分析

一: 排名分析函数有 row_number, dense_rank, rank, first, last, ntile 等. 其中row_number, dense_rank, rank , first, last 都需要 order by

      A。row_number, dense_rank, rank, 三者区别如下

           row_number    排名不重复连续

          dense_rank     排名重复连续

          rank                   排名重复不连续

   案例说明:

        SELECT t.ename , t.deptno, t.sal,
                        row_number()over(PARTITION BY t.deptno ORDER BY t.sal) AS rw,
                        rank()over(PARTITION BY t.deptno ORDER BY t.sal) AS rk,
                       dense_rank() over(PARTITION BY t.deptno ORDER BY t.sal) AS d_rk
          FROM test_emp t        

  结果:

   

B .  last /first 排名查询

    假设有这样的需求; 检索出每个部门的工资最多, 最少的姓名. 一般情况做法:先检索出工资最多的 在检索出工资最少的  最后合并

  但是利用last /first 能非常快捷的得到答案。

 SELECT t.deptno,
                 MIN(t.ename) KEEP(dense_rank LAST ORDER BY t.sal) AS max_sal_name,
                 MIN(t.ename) KEEP(dense_rank FIRST ORDER BY t.sal) AS min_sal_name
    FROM emp t
  GROUP BY t.deptno

结果:

   

其中:min 确定结果的唯一性 也可以用max.

           keep 说明Oracle只保留符合keep条件的记录.

          dense_rank 告诉Oracle排列的策略,first/last则告诉最终筛选的条件.

C.  ntile 层次查询

      有时我们可能会接到类似这样的需求: 查询出每个部门工资排名前1/5的员工信

      SELECT *
          FROM (
                  SELECT t.deptno,        t.ename,              t.sal,
                                  ntile(5) over(PARTITION BY t.deptno ORDER BY t.sal DESC) AS rn
                     FROM emp t)
         WHERE rn=1

  结果:

      

   

       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值