SQL刷題系列:SQL作爲一種數據庫查詢和程序設計語言,是從事數據技術人員必備的技能,也是各大公司的數據分析、數據挖掘、數據庫等筆試題必考的一種題。所以,不論大家是轉行還是學習都少不了這一關。爲此,Python數據科學開啓了SQL刷題的系列,希望可以幫助有需要的朋友們。 題目來源:本篇內容爲Leetcode上SQL題庫177 難易程度:中等
▌刷題回顧
【SQL刷題系列】:leetcode178 Rank Scores
【SQL刷題系列】:leetcode183 Customers Who Never Order
【SQL刷題系列】:leetcode180 Consecutive Numbers
▌題目描述
Write a SQL query to get the nth highest salary from the
Employee
table.
寫一段SQL查詢語句,以得到Employee表中第n個高的工資。
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
For example, given the above Employee table, the nth highest salary where n = 2 is
200
. If there is no nth highest salary, then the query should returnnull
.
例如,給定以上Employee表,第2高的工資就是200。如果沒找到第n個高的公司,查詢需要返回null。
+------------------------+ | getNthHighestSalary(2) | +------------------------+ | 200 | +------------------------+
▌參考答案
題中已經寫好了一個函數,我們需要將查詢的SQL語句寫在註釋下面,然後返回結果。
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGIN RETURN ( # Write your MySQL query statement below. ); END
參考1:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGIN DECLARE M INT; SET M=N-1; RETURN ( # Write your MySQL query statement below. SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M, 1 ); END
▌答案解析
參考1
查找第n高的工資,我們很自然的想到了LIMIT的用法。
LIMIT X,Y含義:X表示跳過X個數據,Y表示選取Y個數據。
或者使用 LIMIT Y OFFSET X,也是一樣的效果。
如果想要得到第n高的工資,那麼就需要跳過前面n-1個數據。因此,我們直接寫成下面這樣:
SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT N-1, 1
但是這樣寫是有語法錯誤的,SQL語句無法執行。因此我們繞過這種錯誤寫法,而在前面定義一個新的變量M,它的值爲N-1,這樣就可以完美解決了。
DECLARE M INT; SET M=N-1;
所以,最終的完整代碼如下:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGIN DECLARE M INT; SET M=N-1; RETURN ( # Write your MySQL query statement below. SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M, 1 ); END