1. 程式人生 > >【LeetCode--資料庫】薪水問題

【LeetCode--資料庫】薪水問題

176.第二高的薪水(簡單)

題目:編寫一個 SQL 查詢,獲取 Employee 表中第二高的薪水(Salary)

例如下述 Employee 表,SQL查詢應該返回 200 作為第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

期望結果如下:

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

解法:選擇出所有不重複的薪水,按照薪水降序排列後,選擇第二條資料,即為第二高的薪水

select (select distinct Salary from Employee
order by Salary DESC
limit 1 offset 1) as SecondHighestSalary;

PS:limit  n offset m 表示:從第m條開始,選取n條資料(從0開始排序,所以上面選第二條資料 是 offset 1)

177.第N高的薪水

題目:編寫一個 SQL 查詢,獲取 Employee 表中第 高的薪水(Salary)

例如下述 Employee 表,n = 2 

時,應返回第二高的薪水 200。如果不存在第 高的薪水,那麼查詢應返回 null

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

期望結果如下:

+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

解法:思路與上面第二高薪水相同,降序排列後,使用limit offset 選取第N高的薪水

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  declare m int;
  set m = N-1;
  RETURN (
      select distinct Salary
      from Employee 
      order by Salary DESC
      limit 1 offset m
  );
END

PS:這一題涉及mysql的自定義函式(user-defined function UDF),可以先了解下再解題

建立自定義函式,簡單來說就是:

  create function 函式名(形參列表) returns 返回型別  -- 注意是retruns

  begin

    函式體  —— 函式內定義的變數,如上面的 set m = N-1;

    返回值       ——return部分

  end