2017-05-05 26 views
0

任何人都請給我解釋一下下面的查詢的運行時執行: -解釋如何找到了在表emp第三MAX工資

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

更好地解釋你的問題..? – scaisEdge

+1

這是一種非常陳舊(低效)的方式來計算它。看看'DENSE_RANK'來代替。 – dnoeth

回答

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 ROW = 20,其你想要什麼。

一個更好的辦法可以使用等級:

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

我認爲較短的方法是,當你使用(而新)功能NTH_VALUE

SELECT DISTINCT NTH_VALUE(salary, 3) OVER() 
FROM your_table; 
相關問題