๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/SQL

[SQL] Leetcode | 176. Second Highest Salary

by dar0m! 2021. 7. 7.

176. Second Highest Salary

Easy
 

Second Highest Salary - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

๋ฌธ์ œ ์ ‘๊ทผ

  • ๋‘ ๋ฒˆ์งธ๋กœ ๋†’์€ ๊ธ‰์—ฌ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ๋ฌธ์ œ๋Š”... ์‚ฌ๋žŒ์ด 2๋ช… ๋ฏธ๋งŒ์ผ ๋•Œ null์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ฒ˜์Œ ์ ‘๊ทผ ํ–ˆ๋˜ ๋ฐฉ๋ฒ•์€ limit, offset ์ด์—ˆ๋Š”๋ฐ, ์ด ๊ตฌ๋ฌธ์œผ๋กœ๋Š” ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • null์„ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋‚˜..? null ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ๋ชป์ฐพ๊ณ  Discuss ํƒญ์—์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ–ˆ๋‹ค.
    select salary as SecondHighestSalary
    from Employee
    order by salary desc limit 1 offset 1;

1. ๊ฐ€์ƒ ํ…Œ์ด๋ธ” WITH AS, ์ˆœ์œ„ ํ•จ์ˆ˜ DENSE_RANK()

with salary_rank as (

    select salary, DENSE_RANK() over (order by Salary desc) as rank_s
    from employee

)

select max(distinct salary) as SecondHighestSalary
from salary_rank
where rank_s = 2;
  • ๊ทธ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ์œ„์— ์žˆ๋Š” sql ๊ตฌ๋ฌธ์ธ๋ฐ, with as ์ ˆ์„ ํ™œ์šฉํ•ด์„œ ๊ฐ€์ƒ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ , ๊ฐ€์ƒ ํ…Œ์ด๋ธ”์˜ rank_s์—ด ๊ฐ’์„ ํ™œ์šฉํ•ด์„œ ์ •๋‹ต์„ ๊ตฌํ•œ๋‹ค.
    • rank_s์˜ ์ด๋ฆ„๋„ ์ฒ˜์Œ์—” rank๋กœ ํ–ˆ๋‹ค๊ฐ€ RANK()ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋– ์„œ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ–ˆ๋‹ค.
    • ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ DENSE_RANK() ํ•จ์ˆ˜์ธ๋ฐ, ์ด ํ•จ์ˆ˜๋Š” over ์ ˆ์— ์“ฐ์—ฌ์ง„ ํŠน์ • ์—ด์˜ ๊ฐ’์— ๋Œ€ํ•ด ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๋Š” ํ•จ์ˆ˜๋‹ค.
      • ์ž๋งคํ’ˆ RANK(), ROW_NUMBER()

2. DENSE_RANK()

select MAX(salary) as SecondHighestSalary
from (
    select salary, DENSE_RANK() over (order by Salary desc) as rank_s
    from employee
) as salary_rank
where rank_s = 2;
  • ๋ณ„๋„์˜ ๊ฐ€์ƒ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ , from ์ ˆ์—์„œ ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ์ •์˜ํ•˜์—ฌ ํ™œ์šฉ

3. MAX, WHERE ์ ˆ ์ž˜ ์“ฐ๊ธฐ..

SELECT MAX(Salary) AS SecondHighestSalary 
FROM Employee 
WHERE SALARY != (SELECT MAX(Salary) FROM Employee)
  • where ์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ? ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ด๋ ‡๊ฒŒ ์งง๊ฒŒ๋„ ํ’€ ์ˆ˜ ์žˆ์Œ.

 

RANK / DENSE_RANK / ROW_NUMBER ํ•จ์ˆ˜

๋ชจ๋‘ ํŠน์ • ์—ด์˜ ๊ฐ’์— ๋Œ€ํ•ด ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๋Š” ํ•จ์ˆ˜
RANK() OVER([PARTITION BY COL_NAME_1] ORDER BY COL_NAME_2 [DESC])

RANK๋Œ€์‹  DENSE_RANK / ROW_NUMBER๋กœ ๋Œ€์น˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
[...]๋กœ ๋œ ๋ถ€๋ถ„์€ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํ•จ์ˆ˜ ๊ฒฐ๊ณผ
RANK ๊ณต๋™ ์ˆœ์œ„๋งŒํผ ๊ฑด๋„ˆ๋œ€ (ex: 1,2,2,4 ...)
DENSE_RANK ๊ณต๋™ ์ˆœ์œ„๋ฅผ ๋›ฐ์–ด๋„˜์ง€ ์•Š์Œ (ex: 1,2,2,3 ...)
ROW_NUMBER ๊ณต๋™ ์ˆœ์œ„๋ฅผ ๋ฌด์‹œํ•จ (ex: 1,2,3,4 ...)
  • ๊ฐ€๋ น salary๊ฐ€ (2000,3000,3000,4000) ๋ผ๊ณ  ํ•  ๋•Œ,
    • RANK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด (4,2,2,1)์ด ์ถœ๋ ฅ๋˜๊ณ 
    • DENSE_RANK๋Š” (3,2,2,1)์ด,
    • ROW_NUMBER๋Š” (4,3,2,1)์ด ์ถœ๋ ฅ๋œ๋‹ค.

์ถœ์ฒ˜:

 

[MYSQL] RANK/DENSE_RANK/ROW_NUMBER ํ•จ์ˆ˜

RANK/DENSE_RANK/ROW_NUMBER ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ํŠน์ • ์—ด์˜ ๊ฐ’์— ๋Œ€ํ•ด ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๋Š” ํ•จ์ˆ˜๋‹ค. ์„œ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค RANK() OVER([PARTITION BY COL_NAME_1] ORDER BY COL_NAME_2 [DESC]) RANK๋Œ€์‹  DENSE_RANK/ROW_NUMBER๋กœ..

satisfactoryplace.tistory.com

 

  • PARTITION BY COL_NAME_1
    • ๋ถ€์„œ๋ณ„ salary๋ฅผ ์•Œ ๊ณ  ์‹ถ์„ ๋•Œ, COL_NAME_1์— department_id ๋ฅผ ๋„ฃ์œผ๋ฉด salary์ˆœ์œ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์ถœ์ฒ˜์˜ ๋ธ”๋กœ๊ทธ์—์„œ ์•Œ๋ ค์ค€๋Œ€๋กœ ๋”ฐ๋กœ ๊ฐ€์ƒ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ , from ์ ˆ์„ ํ™œ์šฉํ•ด์„œ Salary_rank ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ฑํ•ด ๋ดค๋Š”๋ฐ, ์ด ๊ตฌ๋ฌธ๋„ limit - offset ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์ด null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋ชปํ•ด์„œ ํ‹€๋ฆฐ๋‹ค.
    • ์•„๋ฌด๋ž˜๋„ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ null์ด ์ œ๋Œ€๋กœ ๋‚˜์˜ค๋Š” ๋ฌธ์ œ๊ฐ™๋‹ค. → ์ •๋‹ต!
    • MAX๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜ํ•˜๋‹ˆ ์ •๋‹ต๋จ
    • select MAX(salary) as SecondHighestSalary from ( select salary, DENSE_RANK() over (order by Salary desc) as rank_s from employee ) as salary_rank where rank_s = 2;

 

ํ•œ ์ค„ ํ‰

sql ์ง„์งœ ํ—ฌ์ด๋‹ค. Easy ๋งž๋ƒ๊ณ ...

๋Œ“๊ธ€