[LeetCode] 176. Second Highest Salary (Medium)
์ ๋์ฒ๋ผ ํผ ์ฌ๋ ํ๋ช ๋ ๋ชป๋ด์ ์ฐ๋ ๊ธ
๋๋ฒ์งธ๋ก ๋์ ๊ธ์ฌ๋ฅผ ์ถ์ถํ๋ผ๋ ๋ฌธ์ ์ธ๋ฐ, ๊ทธ๋ฐ ๊ธ์ฌ๊ฐ ์์ ๋(=์๋ณธ๋ฐ์ดํฐ๊ฐ 1row์ผ๋) ๊ณต์งํฉ์ด ์๋ null์ด ๋์ค๊ฒ ํ๋ผ๋ ์ถ๊ฐ์กฐ๊ฑด์ด ์ด ๋ฌธ์ ๋ฅผ medium์ผ๋ก ๋ง๋ค์ด์ค๋ค..
์ฌ๋๋ง๋ค 1) ๋๋ฒ์งธ๊ธ์ฌ ์ถ์ถ๋ฒ 2) null๋์ค๊ฒ ํ๋ ๋ฒ ์๊ฐํ๊ฒ ๋ค ๋ฌ๋ผ์ ์ ๊ธฐํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋๊ฐ์ด ํผ ์ฌ๋์ด ์์
๋ด ์ฟผ๋ฆฌ
SELECT (CASE WHEN MAX(rn)>1 THEN salary ELSE null END) AS SecondHighestSalary
FROM (SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rn
FROM employee) sub
WHERE rn=2
๋๋ฒ์งธ๋ก ๋์~์ด๋ผ๊ธธ๋ ์ฒ์๋ถํฐ DENSE_RANK()๊ฐ ์๊ฐ๋ฌ๋ค.
๋ค๋ง null๋์ค๊ฒ ํ๊ธฐ ์ํด ์๋ฅผ ์๋ธ์ฟผ๋ฆฌ๋ก ๊ฐ์ธ๊ณ , CASE๋ฌธ์ผ๋ก ์์๊ฐ ์ ์ด๋ 2์ ์ด์์ ์๋ ๊ฒฝ์ฐ์ salary๋ฅผ ๋ฐํํ๊ณ ๊ทธ์ธ์ null ๋์ค๊ฒ ํ๋ผ๊ณ ํ๋ค.
์คํผ์ ์๋ฃจ์ 1
SELECT
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1) AS SecondHighestSalary
DESC ์ ๋ ฌ, LIMIT 1 OFFSET 1, DISTINCT ์ถ์ถ๋ก 2์๊ธ์ฌ๋ฅผ ๊ณจ๋ผ๋ผ ์ ์๋ค
์ฌ๊ธฐ์ ๋๋๋ฉด ๋ต์ด ์์ ์ ๋น์นธ์ด ๋์ค๊ธฐ์
์ด๊ฑธ ๋ SELECT๋ฌธ์ ๋ฃ์ด์ฃผ๋ฉด (FROM์ ์์ด๋ ๋์ํจใ ใ ) ์ด์ null๋ก ๋์จ๋ค
์คํผ์ ์๋ฃจ์ 2
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary
์๋ ์ฝ๊ฐ ์๋์ฌ๋๋ง ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ผ๋ฉด ์ด๊ฑด IFNULL()์ด๋ผ๋ ๋ช ์์ ์ธ ๋ฐฉ๋ฒ ์ฌ์ฉ
๋ค๋ฅธ ๋ฐฉ๋ฒ
SELECT MAX(Salary) AS SecondHighestSalary
FROM Employee
WHERE Salary < (SELECT MAX(Salary) FROM Employee)
์ต๋๊ฐ๋ณด๋จ ์์ผ๋ฉด์ MAX()์ธ ์ ๋ฅผ SELECTํด์ค๋ฉด ๋๋ค
์ด๋ MAX()ํจ์๋ ๊ฐ์ด ์์ผ๋ฉด ๊ณต์งํฉ์ด ์๋ null์ ๋ฐํํ๋ ์ฑ์ง์ด ์๋ค (SQLD์์ ๋ฐฐ์)
์ผํ์ํผ ์ฟผ๋ฆฌ
์ ๋ฆฌ
๋๋ฒ์งธ ๊ธ์ฌ ๋์ค๊ฒ? - DENSE_RANK() / LIMIT 1 OFFSET 1 / salary < MAX(salary)
NULL ๋์ค๊ฒ? -CASE๋ฌธ / SELECT์ ์๋ธ์ฟผ๋ฆฌ / IFNULL() / MAX()