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}。