2017-07-10 69 views
1

我試圖從列表中找到每個部門的第n個最大工資。我能夠使用聚合來完成基本的最小值和最大值,例如如何找到不同部門的第n個最高工資?

Select DEPARTMENT, MAX(SALARY) FROM dept_salary 
GROUP BY 1 

使用MySQL,我能夠根據個人而不是相結合,得到第n個月薪:

SELECT DISTINCT DEPARTMENT, SALARY FROM dept_salary 
ORDER BY 2 DESC 
LIMIT n,1 

DEPARTMENT   SALARY 
------------------------- 
Customer Service 143937 
Human Resources 141953 
Customer Service 138637 
Customer Service 137535 
Customer Service 136548 
Customer Service 135650 
Marketing   135497 
Customer Service 134893 
Customer Service 133837 
Customer Service 133569 

如何得到這個工作的任何指針是善意的讚賞。

+0

這看起來很像功課。你確定我們應該爲你做嗎? – Strawberry

+1

@codeBarer此外,如果這是一個家庭作業/考試/面試問題,你最好建議提及它,因爲,雖然戈登的回答是正確和快速,可能是解決任何真實世界問題的最佳解決方案,但通常不會得分最高點,因爲它不使用標準的SQL(集),這往往是測試的邊界條件。 – Solarflare

+0

@Solarflare謝謝,我正在準備面試,所以我自己提出了上述問題。 – codeBarer

回答

2

對於一般的解決方案,變量是最簡單的方法:

select ds.* 
from (select ds.*, 
      (@rn := if(@d = department, @rn + 1, 
         if(@d := department, 1, 1) 
         ) 
      ) as rn 
     from (select distinct department, salary 
      from dept_salary 
      ) ds cross join 
      (select @rn := 0, @d := '') params 
     order by department, salary desc 
    ) ds 
where rn = 3; -- for instance 
1

嘗試GROUP BY部門:

SELECT DEPARTMENT, MAX(SALARY) AS max_salary FROM dept_salary 
GROUP BY DEPARTMENT 
ORDER BY SALARY DESC 
+0

這是無助於找到每個部門的第n個工資 –

+0

對不起,由於訂單後使用'group by',現在它的工作正常 –

+0

仍然是錯誤的..檢查問題OP總是不希望每個部門的最高工資。每個部門的第n個工資都可以是任何數字 –

0
select 
DISTINCT(salary) 
from dept_salary 
order by salary desc 
limit 1,1 
+0

總是在解釋你的答案。僅有代碼的職位是低質量的,因爲他們很少教育讀者。 – mickmackusa

0
set @nthMaxSalary = 2; 

select ctr,dept,salary from (
select @rowCtr := if(@dept = dept,@rowCtr +1,1) as ctr 
,@dept := dept dept 
,salary 
from dept_salary 
order by dept,salary desc 
) t where ctr = @nthMaxSalary ; 
相關問題