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个工资会发生什么?


当前回答

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()的顺序,而不是实际数据的顺序

其他回答

SELECT empno,
       deptno,
       sal,
       RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank"
FROM   emp;

     EMPNO     DEPTNO        SAL       rank
---------- ---------- ---------- ----------
      7934         10       1300          1
      7782         10       2450          2
      7839         10       5000          3
      7369         20        800          1
      7876         20       1100          2
      7566         20       2975          3
      7788         20       3000          4
      7902         20       3000          4
      7900         30        950          1
      7654         30       1250          2
      7521         30       1250          2
      7844         30       1500          4
      7499         30       1600          5
      7698         30       2850          6


SELECT empno,
       deptno,
       sal,
       DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank"
FROM   emp;

     EMPNO     DEPTNO        SAL       rank
---------- ---------- ---------- ----------
      7934         10       1300          1
      7782         10       2450          2
      7839         10       5000          3
      7369         20        800          1
      7876         20       1100          2
      7566         20       2975          3
      7788         20       3000          4
      7902         20       3000          4
      7900         30        950          1
      7654         30       1250          2
      7521         30       1250          2
      7844         30       1500          3
      7499         30       1600          4
      7698         30       2850          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()将为集合中的值分配连续的排名(因此在平局的情况下,整数排名值之间不会有差距)。

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

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():它提供连续的整数。

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