哈囉!我又來了,每週一篇文章應該是對我而言最舒服的頻率了,好啦!那是題外話XD話說上一個禮拜的SQL挑戰出乎意料的出現很多高手,也在這裡感謝大家願意分享自己的解法,我也很開心可以在自己的文章下能有這樣子的程式小交流,那今天的主題就繼續來玩SQL吧!題目名稱:Nth Highest Salary
難易度:中
題目內容:將參數n傳入FunctiongetNthHighestSalary(n),並回傳Employee資料表中領第n高的薪水金額。
例如:
Id Salary
1 100
2 200
3 300
getNthHighestSalary(2),將n以2帶入函式,讓函式回傳Employee資料表中第2高的薪水金額,所以答案是200。
2.Employee資料表:
Id Salary
1 100
2 100
getNthHighestSalary(2),將n以2帶入函式,讓函式回傳Employee資料表中,第2高的薪水金額,但是因為表中只有100一個薪額,沒有所謂的第二高,所以得回傳null。
好的,那接下來就開始吧!
/*建立一個能夠傳入參數 @N 的Function*/
CREATE FUNCTION getNthHighestSalary(@N INT) RETURNS INT AS
/*T-SQL的範圍開始*/
BEGIN
/*直接回傳*/
RETURN (
/*用DISTINCT過濾掉相同金額的薪水*/
SELECT DISTINCT Salary
FROM Employee
/*將金額由大到小排列*/
ORDER BY Salary DESC
/*用分頁語法取出略過 @N 筆資料後的第1筆資料
如果 @N 為1就要帶出第一高,所以略過0(@N-1)筆資料
如果 @N 為2就要帶出第二高,所以略過1(@N-1)筆資料*/
OFFSET (@N-1) ROWS FETCH NEXT 1 ROWS ONLY
);
/*T-SQL的範圍結束*/
END
上面是我的個人解法XD,另外我在問題討論區中有看到一個覺得還滿特別的解法,和大家分享該網友解法:
/*建立一個能夠傳入參數 @N 的Function*/
CREATE FUNCTION getNthHighestSalary(@N INT) RETURNS INT AS
/*T-SQL的範圍開始*/
BEGIN
RETURN (
/*(3)最後再查出不重複的薪水,也就是第幾名*/
SELECT DISTINCT salary
FROM employee e1
/*(2)拿到排名後就可以直接和 @N 做比較,看哪一個排名符合條件*/
WHERE @N =
/*(1)精華就在這個子查詢了,他JOIN了外面層資料表的薪水,
並比較內層大於等於該薪水的數量有幾個,
如果外面的薪水最高是300,那JOIN到內層資料表大於等於300的個數就一個,
如果外面的薪水第二高是200,那JOIN到內層資料表大於等於200的個數就兩個,
所以經過子查詢處理,其實就可以帶出各金額的排名*/
(SELECT COUNT(DISTINCT salary)
FROM employee e2
WHERE e1.salary <= e2.salary)
);
/*T-SQL的範圍結束*/
END