四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)

  • 2020 年 08 月 01 日
  • 83次
  • 406 字
  • 暂无评论

1. ROW_NUMBER()函数

  • 基本语法:
select ROW_NUMBER() over (partition by...  order by...) as ORDER_NUM from your_table t
  • 示例:
--根据每个省进行分组并排序
SELECT ROW_NUMBER() OVER (PARTITION BY SUBSTR(a.code,0,2) ORDER BY A.CODE ) AS ORDER_NUM, 
       A.CODE, A.NAME 
FROM dcncy_china_area_code a WHERE A.IS_DEL = '0' ORDER BY A.CODE;
  • 注意:在使用row_number实现分页时需要特别注意一点,over子句中的order by 要与Sql排序记录中的order by 保持一致,否则得到的序号可能不是连续的。
    1.png

2. RANK()函数

  • rank函数用于返回结果集的分区内每行的排名, 行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。
  • 基本语法:
select RANK() over (partition by...  order by...) as ORDER_NUM from your_table t
  • 示例:
SELECT RANK() OVER (PARTITION BY a.deptno ORDER BY a.sal DESC) AS order_num,
       a.*
FROM dcncy_emp a;

2.png

3. DENSE_RANK()函数

  • dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第四名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。
  • 基本语法:
select DENSE_RANK() over (partition by...  order by...) as ORDER_NUM from your_table t
  • 示例:
SELECT DENSE_RANK() OVER (PARTITION BY a.deptno ORDER BY a.sal DESC) AS order_num,
       a.*
FROM dcncy_emp a;

3.png

4. NTILE()函数

  • Ntile()函数为各个记录在记录集中的排名计算比例,返回每条记录所在集合比例位置的值。
  • 基本语法:
select NTILE() over (partition by...  order by...) as ORDER_NUM from your_table t
  • 示例:
SELECT NTILE(4) OVER (PARTITION BY a.deptno ORDER BY a.sal DESC) AS order_num,
       a.*
FROM dcncy_emp a;

4.png


版权属于:东窗凝残月

本文链接:https://blog.jsiqi.com/index.php/Oracle/53.html

欢迎学习交流,转载请保留作者信息以及原文链接,文章注明不可转载的除外。



—— 暂无评论 ——

OωO