๐ ๋ณธ ํฌ์คํ ์์ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ์๋ฃ์ ์ถ์ฒ๋ HackerRank ์์ ๋ฐํ๋๋ค. ๋ ๋ค์ํ SQL ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋ ค๋ฉด HackerRank ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํด ๋ณด์ธ์!
์ด๋ฒ ํฌ์คํ ์์๋ HackerRank ์ฌ์ดํธ์ SQL ๋ฌธ์ ์ค 'Top Earners' ๋ฌธ์ ์ ๋ํ ์๋ก ๋ค๋ฅธ 3๊ฐ์ง ํ์ด๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํด๋ณด๋ ค ํ๋ค. ์ด 3๊ฐ์ง ํ์ด์ ๊ณตํต์ ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ธ ๋ฐ๋ฉด ์ฐจ์ด์ ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ SQL ๊ตฌ๋ฌธ์ ์ด๋ ์์น ์ฆ, HAVING ๋ค์์ธ์ง, WHERE ๋ค์์ธ์ง, FROM ๋ค์์ธ์ง์ ๋ฐ๋ผ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง๋ค๋ ์ ์ด๋ค.
์ฐ์ ํ์ดํ ๋ฌธ์ ์ ๋ฌธ์ ๊ฐ ์๊ตฌํ๋ ์ฌํญ์ ๋ํด์ ์์๋ณด์. ๋ฌธ์ ์๋ณธ์ ๋ณด๊ธฐ ์ํด์๋ ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํด ํ์ธํด๋ณด์.
์ ํ ์ด๋ธ์ด ์ฃผ์ด์ก์ ๋, ๋ฌธ์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ๋ค.
We define an employee's total earnings to be their monthly 'Salary * Months' worked, and the maximum total earnings to be the maximum total earnings for any employee in the Employee table. Write a query to find the maximum total earnings for all employees as well as the total number of employees who have maximum total earnings. Then print these values as space-separated integers.
([๊ฐ๋ตํ๊ฒ ํด์ํ์๋ฉด], ์ฃผ์ด์ง ํ ์ด๋ธ์ Salary ์นผ๋ผ๊ณผ Months ์นผ๋ผ์ ๊ณฑํ ์๋ก์ด ์นผ๋ผ์ธ Earnings๋ฅผ ์์ฑํ๊ณ Earnings์ ๊ฐ์ฅ ๋์ ๊ฐ๊ณผ ๊ทธ ๋์ ๊ฐ์ ๊ฐ๋ ์ง์๋ค์ ๋ช ์(count)๋ฅผ ์ถ๋ ฅ์์ผ๋ผ.)
๋ฌธ์ ์์ ์๊ตฌํ๋ ์ถ๋ ฅํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฌธ์ ํ์ด ๋ฐฉ๋ฒ์ ์๊ด์์ด ํด๋น ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์ ์๊ฐํด์ผ ํ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฐ์ Earnings์ ๊ฐ์ฅ ๋์ ๊ฐ์ ์ถ๋ ฅํ๊ธฐ
- Earnings์ ๊ฐ์ฅ ๋์ ๊ฐ์ ๊ฐ๋ ๋ฐ์ดํฐ row๋ฅผ count ํ๊ธฐ
์ด์ 3๊ฐ์ง์ ์๋ก ๋ค๋ฅธ ํ์ด๋ฒ์ ์ดํด๋ณด์.
1. HAVING ๊ณผ ์๋ธ์ฟผ๋ฆฌ ์ด์ฉํ๊ธฐ
HAVING์ GROUP BY ๊ฐ ์ ํ์ผ๋ก ๋ฑ์ฅํด์ผ ์ฌ์ฉํ ์ ์๋ ๋ฌธ๋ฒ์ผ๋ก, ํน์ ์นผ๋ผ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ ํ์ ๋, ์ถ๊ฐ์ ์ธ ์กฐ๊ฑด์ ๋ฌ์ ํํฐ๋ง ํด์ฃผ๋ ํจ๊ณผ๊ฐ ์๋ค. HAVING์ ์์ธํ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์. HAVING ๊ณผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
SELECT (months*salary) AS earnings, COUNT(*)
FROM Employee
GROUP BY earnings
HAVING earnings = (SELECT MAX(months*salary)
FROM Employee)
์ด์ ์ ์ธ๊ธํ๊ธฐ๋ ํ์ง๋ง WHERE์ SELECT ~ FROM ์ฌ์ด์์ ์๋กญ๊ฒ ์ ์๋ ์๋ก์ด ๋ณ์์ธ (์ฌ๊ธฐ์๋) earnings ๋ผ๋ ์๋ก์ด ์นผ๋ผ์ ๋ํด ์กฐ๊ฑด์ ๋ฌ ์ ์์ง๋ง GROUP BY๋ ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ์์ ๊ฐ์ ํ์ด๊ฐ ๊ฐ๋ฅํ๋ค.
2. WHERE ๊ณผ ์๋ธ์ฟผ๋ฆฌ ์ด์ฉํ๊ธฐ
๋ค์์ WHERE ์ ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ธ๋ฐ, ๋จผ์ ํด๋น ํ์ด๋ถํฐ ์ดํด๋ณด์.
SELECT (months*salary) AS earnings, COUNT(*)
FROM Employee
WHERE (months*salary) = (SELECT MAX(months*salary) FROM Employee)
GROUP BY earnings
1๋ฒ๊ณผ ๋ค๋ฅธ์ ์ด ๋ฌด์์ธ์ง ๋ณด์ด๋๊ฐ? WHERE ์ ์ ์ดํด๋ณด๋ฉด months*salary ๋ผ๊ณ ๋์ด ์๋ค. ์ด๋ ๊ธฐ์กด์ ๋ณ์๋ง์ ํ์ฉํด ์ฐ์ฐ์ ํ๋ค๋ ์๋ฏธ์ด๋ค. ์ฆ, SELECT ~ FROM ์ ์ฌ์ด์์ ์ ์๋์ด ์๋ earnings ๋ผ๋ ์๋กญ๊ฒ ๋ง๋ค์ด์ง ์นผ๋ผ์ ์ด์ฉํ๋ ๊ฒ์ด ์๋ WHERE ์ ์์ ๊ธฐ์กด์ ์กด์ฌํ๋ months ์ salary ์นผ๋ผ์ ์ฌ์ฉํด ์๋กญ๊ฒ ์ ์ํด์ฃผ์๋ค. ์ด๋ ๊ฒ ๋ง์ฝ WHERE ์ ์์ ์๋ก์ด ์นผ๋ผ์ ๋ง๋ค์ด ์กฐ๊ฑด์ ๋ฌ์์ฃผ๋ ค๋ฉด ์์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
3. FROM ๊ณผ ์๋ธ์ฟผ๋ฆฌ ์ด์ฉํ๊ธฐ
์ด๋ฒ ํ์ด๋ FROM ๊ณผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ๋ earnings ์ '์ต๋๊ฐ'์ ํ์ฉํด์ผ ํ๋ค๋ ์ ์์ ORDER BY ์ LIMIT ์ ์ฌ์ฉํด ํด๊ฒฐํ ์ ์๋ค.
SELECT sub.earnings, COUNT(*)
FROM (SELECT *, (months*salary) AS earnings
FROM Employee) sub
GROUP BY sub.earnings
ORDER BY sub.earnings DESC
LIMIT 1
์ด๋ฒ ๋ฌธ์ ์์ ๋ ํ ๊ฐ์ง ์ป์ด๊ฐ ์ ์ ์ต๋๊ฐ ๋๋ ์ต์๊ฐ์ ๊ตฌํ ๋ ORDER BY ์ LIMIT 1 ์ ์ ์ ํ ํ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
ORDER BY price ASC LIMIT 1 => price๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ ๋ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ๊ฐ = price์ ์ต์๊ฐ(์ฐธ๊ณ ๋ก ASC๋ ๋ํดํธ๊ฐ์ด๋ฏ๋ก ์๋ต ๊ฐ๋ฅ)
ORDER BY price DESC LIMIT 1 => price๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ ๋ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ๊ฐ = price์ ์ต๋๊ฐ