解释如何在emp表中找到第三个MAX工资

时间:2017-05-05 16:30:51

标签: sql oracle

任何人都可以向我解释以下查询的运行时执行: -

select distinct sal 
from emp e1 
where 3 = (select count(distinct sal) 
           from emp e2 
           where e1.sal <= e2.sal);

2 个答案:

答案 0 :(得分:2)

select distinct sal
from emp e1
where 3 = (
        select count(distinct sal)
        from emp e2
        where e1.sal <= e2.sal
        )

它是一个相关查询,表示子查询为外部查询的每一行运行:

子查询返回大于或等于给定工资的不同工资的计数

例如,emp表中有以下值:

10
20
30
40

假设外部查询位于sal = 40的行中。子查询返回的计数将为1.

for sal = 30, count = 2
for sal = 20, count = 3
for sal = 10, count = 4

所以只有符合条件的行才是sal = 20的行,这就是你想要的。

更好的方法是使用rank:

select distinct sal
from (
    select t.*,
        dense_rank() over (
            order by salary desc
            ) as rnk
    from your_table t
    ) t
where rnk = 3;

答案 1 :(得分:0)

我认为更简单的方法是使用(相当新的)函数NTH_VALUE

SELECT DISTINCT NTH_VALUE(salary, 3) OVER ()
FROM your_table;