230209
(새벽에 적어 하루가 지나지 않은 거라 생각하고 9일로 적었다.)
Challenges
문제 정리
Julia asked her students to create some coding challenges. Write a query to print the hacker_id, name, and the total number of challenges created by each student. Sort your results by the total number of challenges in descending order. If more than one student created the same number of challenges, then sort the result by hacker_id. If more than one student created the same number of challenges and the count is less than the maximum number of challenges created, then exclude those students from the result.
처음 적은 것
--조건 제외
SELECT hacker_id, COUNT(*) challenges_created
FROM Challenges
GROUP BY hacker_id
ORDER BY challenges_created DESC, hacker_id
--조건2
SELECT challenges_created
FROM (
SELECT COUNT(*) challenges_created
FROM Challenges
GROUP BY hacker_id
) cc
GROUP BY challenges_created
HAVING COUNT(*) = 1
여기서 생기는 의문점...
1. GROUP BY에 hacker_id만 넣게 되면 name을 출력하지 못하는데 INNER JOIN 이용해서 name도 넣어도 되나?
2. 조건2을 작성했는데 코드가 길어지고 조건을 제외한 결과와 비슷해 WITH문 사용해서 작성하고 싶은데 HackerRank는 WITH문이 안 돼서 이렇게 길게 적어도 되나?
challenges_created의 최대값을 작성하려면 비슷한 구문을 또 작성해야하는데 중복되는 부분이 너무 많아져서 답이 틀렸다고 생각했다.
최대한 중복을 줄이기 위한 방법을 생각해봤는데 다 적는거 말고는 답이 없어..모르겠다하고 문제풀이 확인했다.
근데 내가 생각한게 다 맞았다.
GROUP BY에 hacker_id, name 넣고
중복이 되더라도 길게 작성하는 것이 맞았다.
그냥 틀리더라도 길게 풀어볼 걸 그랬다.
(틀리더라도 제대로 틀리고 고치자. 생각해본 건 밀고나가보자)
문제풀이 확인 후 정리(문제풀이와 같음)
SELECT h.hacker_id, h.name, COUNT(*) challenges_created
FROM Challenges c
INNER JOIN Hackers h ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, h.name
HAVING challenges_created = (SELECT MAX(challenges_created)
FROM (
SELECT COUNT(*) challenges_created
FROM Challenges
GROUP BY hacker_id
) cc_max)
OR challenges_created IN (
SELECT challenges_created
FROM (
SELECT COUNT(*) challenges_created
FROM Challenges
GROUP BY hacker_id
) cc
GROUP BY challenges_created
HAVING COUNT(*) = 1
)
ORDER BY challenges_created DESC, hacker_id
+버전이 안 맞는지 HarkerRank MySQL에서는 WITH문 사용 못 한다고 함.
HarkerRank MS SQL Server에서 WITH문 사용해서 풀어보기(풀이 보고 적음)
WITH counter AS (
SELECT hackers.hacker_id
, hackers.name
, COUNT(*) AS challenges_created
FROM Challenges
INNER JOIN Hackers ON Challenges.hacker_id = Hakcers.hacker_id
GROUP BY hackers.hacker_id, hackers.name
)
SELECT counter.hacker_id
, counter.name
, counter.challenges_created
FROM counter
WHERE challenges_created = (SELECT MAX(challenges_created) FROM counter)
OR challenges_created IN (SELECT challenges_created
FROM counter
GROUP BY challenges_created
HAVING COUNT(*) = 1)
ORDER BY counter.challenges_created DESC, counter.hacker_id