176. Second Highest Salary
Description
Table: Employee
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | salary | int | +-------------+------+ id is the primary key (column with unique values) for this table. Each row of this table contains information about the salary of an employee.
Write a solution to find the second highest distinct salary from the Employee table. If there is no second highest salary, return null (return None in Pandas).
The result format is in the following example.
Example 1:
Input: Employee table: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ Output: +---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
Example 2:
Input: Employee table: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | +----+--------+ Output: +---------------------+ | SecondHighestSalary | +---------------------+ | null | +---------------------+
Solutions
Solution 1: Use Sub Query and LIMIT
Thinking
The second highest salary is the second value of the distinct salaries in descending order, or \(\textit{NULL}\) if fewer than two exist. \(\textit{ORDER BY}\) plus \(\textit{LIMIT}\,1\,\textit{OFFSET}\,1\) picks that slot; an outer query keeps a single \(\textit{NULL}\) row when the offset is empty.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 | |
Solution 2: Use MAX() function
Thinking
Solution 1 needs a sort and an offset. The maximum among salaries strictly below the global maximum is the second highest; \(\textit{MAX}\) on an empty set is already \(\textit{NULL}\), so no \(\textit{LIMIT}\) is required.
1 2 3 4 | |
Solution 3: Use IFNULL() and window function
Thinking
After deduplicating, \(\textit{DENSE_RANK}\) numbers salaries descending and we keep rank \(2\). Ties at the top do not consume the second place, which matches “\(k\)-th highest” and extends cleanly.
1 2 3 | |