編寫乙個 sql 查詢,獲取employee
表中第二高的薪水(salary)
。
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述employee
表,sql查詢應該返回 200 作為第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回null
。
+---------------------+
| secondhighestsalary |
+---------------------+
| 200 |
+---------------------+
第一次解答報錯。。。
---- oracle ----
/* write your pl/sql query statement below */
select salary as secondhighestsalary
from
( select salary,
rownum as rn
from
(select salary
from employee
order by salary desc
) b) cwhere c.rn = 2 ---- 執行報錯 當資料只有1行時 執行為空 而不是null
第二次解答。。。依舊報錯
---- oracle ----
/* write your pl/sql query statement below */
select salary as secondhighestsalary
from
( select salary,
row_number() over(order by salary desc) as rn
from employee
) cwhere c.rn = 2 ---- 依舊報錯
解答一---- oracle ----
/* write your pl/sql query statement below */
select max(salary) as secondhighestsalary
from empolyee
where salary <> (select max(salary) from employee) ---- 672ms
解答二
修改第一次出錯的版本,新增判斷後再次嘗試。。。
---- oracle ----
select salary as secondhighestsalary
from
( select salary
from
( select salary,
rownum as rn
from
(select distinct(salary)
from employee
order by salary desc
) b) c
where c.rn = 2
union all
select null from dual
)where rownum = 1 -- 未針對薪水進行去重操作 增加distinct
-- 不新增distinct還執行報錯 新增之後通過
---- 861ms
解答三
好久沒用過mysql
,用法都忘光了。。
使用子查詢和limit
子句
---- mysql ----
select
( select distinct salary
from employee
order by salary desc
limit 1 offset 1
) as secondhighestsalary; ---- 112ms 好快
解答四
為了解決null
的問題,可以使用ifnull
函式
---- mysql ----
select
ifnull(
(select distinct salary
from employee
order by salary desc
limit 1 offset 1
),null) as secondhighestsalary ---- 108ms
去重、排序、獲取第二個、返回為null
時設定返回null
oracle中rownum
的使用必須要包含第一條記錄,也就是類似rownum <= 10
,所以不能使用rownum = 2
提取第2行資料,必須利用巢狀查詢實現。
group by
的速度比distinct
速度要快。
Leetcode 176 第二高的薪水
編寫乙個 sql 查詢,獲取 employee 表中第二高的薪水 salary id salary 1 100 2 200 3 300 複製 例如上述 employee 表,sql查詢應該返回 200 作為第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null。secondhighestsa...
Leetcode176 第二高的薪水
題目 編寫乙個 sql 查詢,獲取 employee 表中第二高的薪水 salary id salary 1 100 2 200 3 300 例如上述 employee 表,sql查詢應該返回 200 作為第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null。secondhighestsa...
Leetcode 176 第二高的薪水
題目難度 簡單題目描述 編寫乙個 sql 查詢,獲取 employee 表中第二高的薪水 salary 例如上述 employee 表,sql查詢應該返回 200 作為第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null。預期結果 正確答案 select max salary as sec...