← Back to list

LeetCode:(SQL)(SQL 50)(Advanced String Functions / Regex / Clause) Second Highest Salary

題目連結:https://leetcode.com/problems/second-highest-salary/description/?envType=study-plan-v2&envId=top-sql-50

許博淳 in 數據共筆 · 2026-05-19 04:45 · 0 claps · 2.1 min read
#leetcode #leetcode-medium #sql #sql-50
Open on Medium ↗

LeetCode:(SQL)(SQL 50)(Advanced String Functions / Regex / Clause) Second Highest Salary

題目連結:https://leetcode.com/problems/second-highest-salary/description/?envType=study-plan-v2&envId=top-sql-50

題意解析

  • 給定多個薪資,薪資可能重複。
  • 找出第二高的薪資,可能多個第二高薪資,回傳一個就好。
  • 如果沒有第二高的薪資,回傳 null

解題思維

  • 用 Dense_Rank,多個第一名時並列第一,同時多個第二也可以並列第二不會變成第三第四等名次

  • 找出 dense_rank = 2 ,同時 limit 1 確保一定只回傳一個

實作程式碼

# Write your MySQL query statement below
WITH get_seq AS (
    SELECT 
        salary
        ,DENSE_RANK()OVER(ORDER BY salary DESC) AS seq
    FROM Employee
)
# 用 select () AS SecondHighestSalary 包住,確保回傳是空值時能夠是 null
SELECT (
    # limit 1 確保只回傳一個
    SELECT
        salary 
    FROM get_seq
    WHERE seq = 2
    LIMIT 1
) AS SecondHighestSalary

解題思維二

  • 這題預設是要用 window function 等進階語法,但其實可以完全不用就解出來
  • 取出不重複,前兩高的薪資
  • 如果沒有第二高的薪資,回傳null,否則回傳第二高薪資

實作程式碼二

# Write your MySQL query statement below
# 取不重複薪資,強制只取出最高的兩個不重複薪資
# 有可能是空值
WITH get_top_2 AS (
    SELECT DISTINCT
        salary
    FROM Employee
    ORDER BY salary DESC
    LIMIT 2
)
# 當沒有兩筆薪資,代表不存在第二高薪資,回傳 null
# 有兩筆薪資就回傳最小值,也就是第二高
SELECT
    CASE
        WHEN COUNT(*) < 2 THEN NULL
        ELSE MIN(salary)
    END AS SecondHighestSalary
FROM get_top_2

메타데이터
post_id
aa91b2654580
slug
leetcode-sql-sql-50-advanced-string-functions-regex-clause-second-highest-salary-aa91b2654580
url
https://medium.com/sherry-yh-li/leetcode-sql-sql-50-advanced-string-functions-regex-clause-second-highest-salary-aa91b2654580
canonical_url
https://medium.com/sherry-yh-li/leetcode-sql-sql-50-advanced-string-functions-regex-clause-second-highest-salary-aa91b2654580
author_url
https://medium.com/@a78800062000
status
ok
fetched_at
2026-07-14 10:09:25