最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

[演算法][SQL]演算法挑戰系列(3)-Nth Highest Salary

XAMPP下载 admin 550浏览 0评论

哈囉!我又來了,每週一篇文章應該是對我而言最舒服的頻率了,好啦!那是題外話XD話說上一個禮拜的SQL挑戰出乎意料的出現很多高手,也在這裡感謝大家願意分享自己的解法,我也很開心可以在自己的文章下能有這樣子的程式小交流,那今天的主題就繼續來玩SQL吧!題目名稱:Nth Highest Salary
難易度:中
題目內容:將參數n傳入FunctiongetNthHighestSalary(n),並回傳Employee資料表中領第n高的薪水金額。
例如:

 1.Employee資料表:

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

 ㄛ,解讀程式碼真的就和翻譯原文書一樣困難,還請大家多多包涵,我盡量使用(1)(2)(3)的順序講解,如果有哪邊搞錯了還請各位大大留言告訴我。這次的題目就是屬於T-SQL的應用了,但是因為不是很困難,所以還是可以直接在RETURN內寫SQL語法來處理掉這一題,不過以後如果真的碰到T-SQL的題目就要開始爬文研究了,,另外提醒一下,上方的註解都是我在編輯文章的時候才打上去的,如果要直接貼到該網站去執行,要記得先把註解都拿掉,因為我提交執行只要有註解都會出錯。那歡迎大家如果有什麼文章內問題,或是如果發現有什麼也是很好用的演算法網站、題目,都可以在下方留言告知我,謝謝大家!

 

转载请注明:XAMPP中文组官网 » [演算法][SQL]演算法挑戰系列(3)-Nth Highest Salary

您必须 登录 才能发表评论!