2012-07-16 75 views
1

如何找到emp表中每個部門的前2名工資?Oracle 10 g -SQL

Emp Table 
----------- 
Row_id Salary Dept 
R1  2000 D1 
R2  3000 D1 
R3  4000 D1 
R4  5000 D1 
R5  2000 D2 
R6  3000 D2 
R7  4000 D2 
R8  5000 D2 

回答

3
select 
    row_id,salary,dept 
from 
(
select 
    row_number() over (partition by dept order by salary desc) as sno, 
    row_id,salary,dept 
from emp 
) t 
where sno<=2 
0

請儘量將

select T1.Dept,T2.Salary 
from Emp_Table T1 join Emp_Table T2 
on T1.Dept=T2.Dept 
and T1.Salary>=T2.Salary 
group by T1.Dept,T2.Salary 
having COUNT(*) <=2 
+0

這可能是時間cousuming對於大表 – Madhivanan 2012-07-16 06:37:40

+2

'ROW_ID'是唯一的,這樣這個查詢不會返回任何行。如果你加入'DEPT',你會得到一些結果,但是它比分析函數版本的效率低得多。 – 2012-07-16 06:40:20

+1

@JustinCave:謝謝你的評論..我已經改變了我的查詢,加入了部門,我在早些時候測試了我的查詢。現在我已經驗證了結果。當我看到這篇文章時,已經有了和row_number()函數的答案。這就是爲什麼我給出了不同的解決方案。關於性能,我不認爲有巨大的差異,因爲我使用相同類型的查詢對很大的表,它只是運行良好。 – 2012-07-16 07:38:42