๐ ๋ฐฉ๋ฒ1: JOIN + WHERE์ ๋ค์ค์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ(๋ด ์ฟผ๋ฆฌ)
SELECT t2.name AS Department
, t1.name AS Employee
, t1.salary AS Salary
FROM Employee t1 LEFT JOIN Department t2 ON t1.departmentID = t2.id
WHERE (t2.name, t1.salary) IN (
SELECT t2.name, MAX(t1.salary)
FROM Employee t1 LEFT JOIN Department t2 ON t1.departmentID = t2.id
GROUP BY t2.name)
"๋ถ์๋ณ๋ก ๊ฐ์ฅ ๋์ ์๊ธ์ ๋ฐ๋ ์ฌ๋์ ์๊ธ, ๋ถ์๋ช , ์ด๋ฆ์ ๊ตฌํด๋ผ"๋ผ๋ ๋ฌธ์ ์๋ค. ์ด๋ ๊ฒ ๋งํ๋ฉด ์ Easy๊ฐ ์๋ Medium์ด์ง ํ๋๋ฐ ์ค์๋ก ๋์น ๊ณณ์ด ๋ง์ ๋ฌธ์ ์๋ค.
1. ๋์ผ๋ถ์ ๋ด ๋์ ์ ๊ณ ๋ ค -> ์๋ธ์ฟผ๋ฆฌ ํ์
์ด๊ฑด ๋ฌธ์ Explanation์ ๋ช ์ํด์ค ๋๋ถ์ ๊ณ ๋ คํ ์ ์์๋ค. ์์ ๋ณด๋ฉด ๊ฐ์ ๋ถ์ ์์ ๋์ ์(๊ฐ์ ์๊ธ์ ๋ฐ๋ ์ฌ๋)๊ฐ ์์๋ค. ์ ๋ต์๋ IT๋ถ์์์ 2๋ช , Sales๋ถ์์์ 1๋ช ์ด๋ ๊ฒ 3์ค์ ๊ฒฐ๊ณผ๊ฐ ๋์์ผ ํ๋ค.
SQL์ GROUP BY๋ ๊ทธ ํํฐ์ ๋ด์์ ํ์ค์ ๊ฒฐ๊ณผ์ฉ๋ง ๋จ๊ธด๋ค. ๋ถ์๋ช ๊ธฐ์ค์ผ๋ก GROUP BYํ ๊ฒฐ๊ณผ์์ ์ง์๋ช ์ ๋ฝ์๋ณด๋ฉด IT๋ถ์ 1๋ช , Sales๋ถ์ 1๋ช ์ด ์ถ๋ ฅ๋์ด ๋์ ์ ํ๋ช ์ด ๋ ๋์จ๋ค. ๊ทธ๋์ GROUP BYํ ์ํ์์ ์ง์๋ช ๊ณผ ์ต๊ณ ์๊ธ์ ๋ฐ๋ก ๋ฝ์์ ์ ์ถํ๋ ๋จ์ผ์ฟผ๋ฆฌ๋ก๋ ๋ฌธ์ ๋ฅผ ํ๋ฆฐ๋ค.
๊ทธ๋์ GROUP BY๋ก๋ ๋ถ์๋ณ ์๊ธ ์ต๋๊ฐ๋ง ๋ฝ์๋๊ณ , ์ด ๊ฐ์ WHERE + IN ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์จ์ ๊ทธ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ๋์ ๋ํด(์กฐ๊ฑด) ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ผ๋ ๋ฉ์ธ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
2. ๋ถ์ ๊ฐ ๋์ ์ ๊ณ ๋ ค -> ๋ค์ค์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ ํ์
์์ฒ๋ผ ํ๊ณ ์ ์ถํ๋ฉด, Run Codeํ๋ฉด Accepted๋์ง๋ง ์ต์ข ๊ฒฐ๊ณผ์์ ํ๋ฆฐ๋ค ใ ใ ..
WHERE + IN์ ๊ธ์ฌ ๊ธฐ์ค์ผ๋ก๋ง ํ๋ค๋ณด๋, HR๋ถ์์ ์ต๊ณ ๊ธ์ฌ์ธ 50000์ ๊ฐ์ ์ก์๋ฅผ ๋ฐ๋ IT๋ถ์์ ์ฌ๋์ด ์ถ๋ ฅ๋๋ ์ค์๋ฅผ ํ๋ค. IN์ ๊ธ์ฌ๋ก๋ง ๋น๊ตํ์ง์๊ณ ๋ถ์๋ช ์ ๊ฐ์ด ๊ณ ๋ คํ๋ค. ๊ทธ๋ ๊ฒ ๋จ์ผ์ปฌ๋ผ์ด ์๋ ๋ค์ค์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ก ์์ ํ๋ ๋น๋ก์ Success๊ฐ ๋ด๋ค. ์คํผ์ Solution๋ ์ด๋ ๊ฒ ํ์๋ค.
๐ ๋ฐฉ๋ฒ2: FROM์ ์๋ธ์ฟผ๋ฆฌ
SELECT t2.name AS Department
, t1.name AS Employee
, t1.salary AS Salary
FROM Employee t1
INNER JOIN (
SELECT departmentID, MAX(salary) AS max_salary
FROM Employee
GROUP BY departmentID) AS sub_t
ON t1.departmentID = sub_t.departmentID
AND t1.salary = sub_t.max_salary
INNER JOIN Department t2 ON t2.id = t1.departmentID
๋ค์ค์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ ๋์ FROM์ ์๋ธ์ฟผ๋ฆฌ๋ก ์์ ํ ์ด๋ธ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฒซ INNER JOIN์ ๋ด ์ฟผ๋ฆฌ์ GROUP BY์ ๋์ผํ ๋ชฉ์ ์ด๋ค. ์ด๋ ๊ฒํ๋ฉด ์ ๋ต์ธ ๋ฐ์ดํฐ ๊ณจ๋ผ์ค๊ธฐ๋ ์์ฑ์ด๋ค.
๋๋ฒ์งธ INNER JOIN์ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์์ ๊ฐ์ ธ์ค๋ผ๋ ์ปฌ๋ผ ๋๋ฌธ์ ํ๊ฑฐ๋ค. ๋ด ํ์ด์์ ํ LEFT JOIN๊ณผ ๋์ผํ ์ด์ .
๐๋ฐฉ๋ฒ3: MAX() ์๋์ฐ ํจ์
GROUP BY๋ก ํ๋ฉด ๊ทธ๋ฃน๋ณ๋ก ํ์ค์ฉ๋ง ๋จ์ ๋ฐ์ดํฐ ๋ชจ์์ด ๋ฐ๋์ง๋ง ์๋์ฐ ํจ์๋ฅผ ์ฐ๋ฉด ์๋ณธ์ด ์ ์ง๋๋ค.
์์ ๊ฐ์ ํ ์ด๋ธ์ ๋ง๋ค๋ฉด ์ ๋ ๊ฒ ์๊ธด ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค. ์ด ์ฌ๋์ '์ง์ง ๊ธ์ฌ'์ ์ด ์ฌ๋์ด ์๋ ๋ถ์์ '์ต๋ ๊ธ์ฌ'๊ฐ ์ผ์นํ๋ ๊ฒฝ์ฐ๋ง ์กฐ๊ฑด์ผ๋ก ๋ฃ์ผ๋ฉด ๋์ด๋ค. ์ํ๊น๊ฒ๋ SELECT์ ์์ ์คํํ ์๋์ฐํจ์๋ WHERE์ ์ ๊ทธ๋๋ก ์ธ ์๊ฐ ์์ด์ ์ ํ ์ด๋ธ์ FROM์ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ณ๋์ ํ ์ด๋ธ๋ก ๋ค๋ค์ค์ผ ํ๋ค.
SELECT Department, Employee, Max_salary AS Salary
FROM (SELECT d.name AS Department
, e.name AS Employee
, e.salary AS real_salary
, MAX(e.salary) OVER (PARTITION BY e.departmentId) AS Max_salary
FROM Employee e JOIN Department d ON e.departmentId = d.id
) AS sub
WHERE sub.real_salary = sub.Max_salary
GROUP BY๋ฅผ ์ํ๊ณ ๋ถ์๋ณ ์ต๋๊ธ์ฌ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด์๋ค.
๋ณธ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฆฌ์ 'SQL ๋ฐ์ดํฐ ๋ถ์ ์บ ํ ์ค์ ๋ฐ' ์ ์๊ฐํ๋ฉฐ ์์ฑํ ๋ด์ฉ์
๋๋ค.
SQL ๋ฐ์ดํฐ ๋ถ์ ์บ ํ์์ ์ ๊ณตํ๋ ์์
์๋ฃ์ ์ ์๊ถ์ ๋ฐ์ดํฐ๋ฆฌ์์๊ฒ ์์ผ๋ฉฐ, ์๋ฃ์ ๋ฌด๋จ ๋ณต์ ๋ฐ ๋ฐฐํฌ, ์์
์ ์ด์ฉ์ ๊ธ์งํฉ๋๋ค.
'๐ฌ MySQL > LeetCode ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LeetCode] 181, 182, 183 (Easy) (0) | 2022.11.17 |
---|---|
[LeetCode] 185. Department Top Three Salaries (Hard) (0) | 2022.07.20 |
[LeetCode] 180. Consecutive Numbers (Medium) (0) | 2022.07.19 |
[LeetCode] 196. Delete Duplicate Emails (Easy) (0) | 2022.07.06 |
[LeetCode] 627. Swap Salary (Easy) (0) | 2022.07.06 |
๋๊ธ