๐Ÿฌ MySQL/LeetCode ํ’€์ด

[LeetCode] 176. Second Highest Salary (Medium)

Chloe._. 2022. 11. 17. 16:57

์™€ ๋‚˜์ฒ˜๋Ÿผ ํ‘ผ ์‚ฌ๋žŒ ํ•œ๋ช…๋„ ๋ชป๋ด์„œ ์“ฐ๋Š” ๊ธ€

 

๋‘๋ฒˆ์งธ๋กœ ๋†’์€ ๊ธ‰์—ฌ๋ฅผ ์ถ”์ถœํ•˜๋ผ๋Š” ๋ฌธ์ œ์ธ๋ฐ, ๊ทธ๋Ÿฐ ๊ธ‰์—ฌ๊ฐ€ ์—†์„ ๋•Œ(=์›๋ณธ๋ฐ์ดํ„ฐ๊ฐ€ 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()