RANK()和DENSE_RANK()函数之间的区别是什么?如何在下面的emptbl表中找出第n个工资?

DEPTNO  EMPNAME    SAL
------------------------------
10       rrr    10000.00
11       nnn    20000.00
11       mmm    5000.00
12       kkk    30000.00
10       fff    40000.00
10       ddd    40000.00
10       bbb    50000.00
10       ccc    50000.00

如果在表数据为空的情况下,如果我想找出第n个工资会发生什么?


当前回答

select empno
       ,salary
       ,row_number() over(order by salary desc) as Serial
       ,Rank() over(order by salary desc) as rank
       ,dense_rank() over(order by salary desc) as denseRank
from emp ;

Row_number() ->用于生成序列号

Dense_rank()将给出连续的排名,但rank()将在排名冲突的情况下跳过排名。

其他回答

rank():用于在一组行中对记录进行排序。

dense_rank(): dense_rank函数的作用类似于RANK函数,只是它分配连续的等级。

查询-

select 
    ENAME,SAL,RANK() over (order by SAL) RANK
from 
    EMP;

输出-

+--------+------+------+
| ENAME  | SAL  | RANK |
+--------+------+------+
| SMITH  |  800 |    1 |
| JAMES  |  950 |    2 |
| ADAMS  | 1100 |    3 |
| MARTIN | 1250 |    4 |
| WARD   | 1250 |    4 |
| TURNER | 1500 |    6 |
+--------+------+------+

查询-

select 
    ENAME,SAL,dense_rank() over (order by SAL) DEN_RANK
from 
    EMP;

输出-

+--------+------+-----------+
| ENAME  | SAL  |  DEN_RANK |
+--------+------+-----------+
| SMITH  |  800 |         1 |
| JAMES  |  950 |         2 |
| ADAMS  | 1100 |         3 |
| MARTIN | 1250 |         4 |
| WARD   | 1250 |         4 |
| TURNER | 1500 |         5 |
+--------+------+-----------+

Rank(), Dense_rank(), row_number() 这些都是窗口函数,这意味着它们首先是有序输入集的窗口。这些窗口根据需求附加了不同的功能。以下是上述3点:

row_number ()

从row_number()开始,因为这形成了这些相关窗口函数的基础。Row_number()顾名思义为应用它的行集提供了一个唯一的数字。类似于给每一行一个序列号。

排名()

row_number()的颠覆可以被称为rank()。Rank()用于为那些重复的有序集行提供相同的序列号,但它仍然保持类似于row_number()的计数,用于所有重复的Rank()含义从下面开始,例如。对于数据2,row_number() =rank()意味着两者只是以重复的形式不同。

Data row_number() rank() dense_rank() 
    1         1                    1       1
    1         2                    1       1
    1         3                    1       1
    2         4                    4       2

最后,

正如名字所示,Dense_rank()是rank()的扩展版本,因为从上面的例子中可以看到,所有数据1的rank() = Dense_rank(),但对于数据2,它的不同之处在于它维护的是rank()与之前的rank()的顺序,而不是实际数据的顺序

RANK()和DENSE_RANK()函数之间的唯一区别是在有“平局”的情况下;也就是说,当一个集合中的多个值具有相同的排名时。在这种情况下,RANK()将为集合中的值分配非连续的“RANK”(当有平局时,导致整数排名值之间的差距),而DENSE_RANK()将为集合中的值分配连续的排名(因此在平局的情况下,整数排名值之间不会有差距)。

例如,考虑集合{25,25,50,75,75,100}。对于这样的集合,RANK()将返回{1,1,3,4,4,6}(注意值2和5被跳过),而DENSE_RANK()将返回{1,1,2,3,3,4}。

RANK()和DENSE_RANK()函数之间的唯一区别是在有“平局”的情况下;也就是说,当一个集合中的多个值具有相同的排名时。在这种情况下,RANK()将为集合中的值分配非连续的“RANK”(当有平局时,导致整数排名值之间的差距),而DENSE_RANK()将为集合中的值分配连续的排名(因此在平局的情况下,整数排名值之间不会有差距)。

例如,考虑集合{30,30,50,75,75,100}。对于这样的集合,RANK()将返回{1,1,3,4,4,6}(注意值2和5被跳过),而DENSE_RANK()将返回{1,1,2,3,3,4}。

秩和密集秩给出了分区数据集中的秩。

Rank():它不会给你连续的整数。

Dense_rank():它提供连续的整数。

在上图中,10008 zip的rank由dense_rank()函数表示为2,rank()函数表示为24,因为它考虑了row_number。