解題目錄
原題
編寫一個 SQL 查詢,獲取 Employee 表中第二高的薪水(Salary) 。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee 表,SQL查詢應該返回 200 作爲第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
我感覺這道題挺簡單的,就是有幾個地方沒想到:
1.如果只有兩條數據,工資都是100,那麼返回null而不是100。
2.如果是100,200,300,400,那麼應該返回300而不是200。我發現我閱讀理解能力最近有點差…
3. 記得最終結果加別名:SecondHighestSalary
解題思路:因爲條件1,所以要去重;因爲條件2,所以要排序,還得是倒序;因爲條件3,改個別名。並且要注意,沒有數據返回null。
我的答案:
select
if(count(s)=1,s,null) SecondHighestSalary
from(
-- 寫hive寫的比較多,所以沒用distinct。
select
salary s
from Employee
group by s
order by s
limit 1,1
) tmp
我感覺leetcode好像不太支持oracle…dense_rank()也可以做這道題,但是mysql裏沒這個函數,oracle裏纔有。我用oracle做的時候,老是莫名其妙的錯。。。
最讓人無語的是,oracle的別名在leetcode的結果裏默認全是大寫,但是答案要求大小寫也要符合。。。但是我的sql裏的別名明明大小寫是正常的。。。我快要瘋了。