KEEP GOING
[MySQL] HackerRank : Challenges 본문
반응형
https://www.hackerrank.com/challenges/challenges/problem
1. 성공한 코드
SELECT Hackers.hacker_id
, name
, COUNT(challenge_id) challenges_created
FROM Hackers
INNER JOIN Challenges ON Hackers.hacker_id = Challenges.hacker_id
GROUP BY hacker_id, name
HAVING challenges_created = (
SELECT MAX(tmp1.challenges_created)
FROM(
SELECT hacker_id
,COUNT(challenge_id) as challenges_created
FROM Challenges
GROUP BY hacker_id
)tmp1
)
OR challenges_created IN(
SELECT tmp2.challenges_created
FROM(
SELECT COUNT(challenge_id) as challenges_created
FROM Challenges
GROUP BY hacker_id
)tmp2
GROUP BY tmp2.challenges_created
HAVING COUNT(*) = 1
)
ORDER BY challenges_created DESC, hacker_id
2. 구하는 과정
-- 1. find max value
-- SELECT MAX(tmp1.challenges_created)
-- FROM(
-- SELECT hacker_id
-- ,COUNT(challenge_id) as challenges_created
-- FROM Challenges
-- GROUP BY hacker_id
-- )tmp1
-- 2. find duplicated challenges_created
-- SELECT tmp2.challenges_created
-- FROM(
-- SELECT COUNT(challenge_id) as challenges_created
-- FROM Challenges
-- GROUP BY hacker_id
-- )tmp2
-- GROUP BY tmp2.challenges_created
-- HAVING COUNT(*) = 1
3. 또 다른 풀이 (CTE)
WITH counter AS(
SELECT Hackers.hacker_id
, Hackers.name
, COUNT(*) challenges_created
FROM Hackers
INNER JOIN Challenges ON Hackers.hacker_id = Challenges.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
CTE란?
Common Table Expression란 단일 명령문의 범위 내에 존재하며 그 명령문 내에서 나중에 여러번 참조 될 수 있는 이름 지정된 임시 결과 세트이다. 3번에서 생성된 counter 테이블은 이러한 개념으로 생성한 임시 테이블로써 아래 SELECT 문에서 해당 counter 테이블에 접근할 수 있다. MySQL에서 사용되는 개념인데 해당 문제에서는 MySQL 버전이 아닌 MS SQL Server 버전에서만 동작한다.
반응형
'code review > sql' 카테고리의 다른 글
[MySQL] LeetCode : Consecutive-Numbers (0) | 2022.02.07 |
---|---|
[MySQL] LeetCode : Department Top Three Salaries (0) | 2022.02.04 |
[python] LeetCode : zigzag-conversion (ceil(), join()) (0) | 2022.02.02 |
[MySQL] LeetCode : Department Highest Salary Solution (0) | 2022.01.28 |
[MySQL] HackerRank : Top Earners Solution (0) | 2022.01.28 |
Comments