[TIL] MySQL TIL Day 3
๐ก [HackerRank] Contest Leaderboard
https://www.hackerrank.com/challenges/contest-leaderboard/problem?isFullScreen=true
Trial
์ด ๋ฌธ์ ๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๋ฌธ์ ์ด๋ค. sql ์ด์ง๋ผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ ๋๋ก ์จ๋ณธ ์ ์ด ์์ด ๋ํญ์ ๊ฒช์๋ค..์ฒ์์๋ GROUP BY๋ก Max์ Sum์ ๋์์ ์ํํ๋ ค ํ์ง๋ง (๋น์ฐํ) ์คํจํ๋ค. ์๋ธ์ฟผ๋ฆฌ๋ ์ฝ๊ฒ ๋งํ๋ฉด SQL๋ฌธ ์์ ์๋ ๋ ๋ค๋ฅธ SQL ๋ฌธ์ด๋ค. ์๋ธ์ฟผ๋ฆฌ์ ๋ํ ์ค๋ช ์ ์ด ํฌ์คํ ์ ์ ์ ๋ฆฌ๋์ด ์์ด ์ฐธ๊ณ ํ๊ธฐ ์ข์๋ค.
Solution
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋จผ์ hacker_id, challenge_id๋ก ๊ทธ๋ฃนํํ์ฌ score์ max๋ฅผ ๋ฝ๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ํ, ๊ธฐ์กด์ hacker table๊ณผ ์กฐ์ธํด์ผ ํ๋ค.
Step 1
FROM ์ ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค. Submission table์์ hacker_id, challenge_id๋ก ๊ทธ๋ฃนํ(Group by) ํ ๊ฐ ๊ทธ๋ฃน๋ณ max score๋ฅผ ์ถ์ถํ๋ค. ํด๋น ์๋ธ์ฟผ๋ฆฌ๋ s๋ก ๋ช ๋ช ํ๋ค.(ALIAS)
Step 2
Step 1์์ ์์ฑํ ์๋ธ์ฟผ๋ฆฌ์ Hackers table๋ฅผ JOIN ํ๋ค. ์ด ๋ hacker_id๋ฅผ ๊ธฐ์ค์ผ๋ก JOIN!
Step 3
์ด์ ๊ฐ hacker_id ๋ณ total score๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด GROUP BY๋ฅผ ๋ค์ ํ๋ค. Output์์ hacker_id, name, total score ์นผ๋ผ์ ํฌํจํ ๊ฒ์ด๋ฏ๋ก GROUP BY hacker_id, name์ผ๋ก ์ง์ ํด์ค๋ค. ๊ฐ total_score์ SUM(score)์ ์ด์ฉํ์ฌ ๊ตฌํ ์ ์๋ค.
Step 4
๋ฌธ์ ์์ ์ ์ํ ์กฐ๊ฑด์ ๋ฐ๋ผ total score์ด 0๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ง ์ ํํ๊ณ , total score ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ, hacker_id ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
SELECT h.hacker_id, h.name, SUM(score) AS total
FROM (SELECT hacker_id, challenge_id, MAX(score) AS score
FROM submissions GROUP BY hacker_id, challenge_id) AS s
JOIN hackers AS h ON h.hacker_id = s.hacker_id
GROUP BY h.hacker_id, h.name
HAVING total > 0
ORDER BY total DESC, hacker_id
๋๊ธ๋จ๊ธฐ๊ธฐ