๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿฌ MySQL/LeetCode ํ’€์ด

[LeetCode] 184. Department Highest Salary (Medium)

by Chloe._. 2022. 7. 8.

๐Ÿ“Œ ๋ฐฉ๋ฒ•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

๋Œ“๊ธ€