176. Second Highest Salary
Easy
๋ฌธ์ ์ ๊ทผ
- ๋ ๋ฒ์งธ๋ก ๋์ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์๋ค. ๋ฌธ์ ๋... ์ฌ๋์ด 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)์ด ์ถ๋ ฅ๋๋ค.
์ถ์ฒ:
- 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 ๋ง๋๊ณ ...
'๐ฅ PS(Problem Solving) ๐ฅ > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQL] Leetcode | 178. Rank Scores (0) | 2021.07.08 |
---|---|
[SQL] ํ๋ก๊ทธ๋๋จธ์ค 7daySQL ์ฑ๋ฆฐ์ง Day 7 (0) | 2019.09.09 |
[SQL] ํ๋ก๊ทธ๋๋จธ์ค 7daySQL ์ฑ๋ฆฐ์ง Day 6 (0) | 2019.09.07 |
[SQL] ํ๋ก๊ทธ๋๋จธ์ค 7daySQL ์ฑ๋ฆฐ์ง Day 5 (0) | 2019.09.06 |
[SQL] ํ๋ก๊ทธ๋๋จธ์ค 7daySQL ์ฑ๋ฆฐ์ง Day 4 (0) | 2019.09.05 |
๋๊ธ