KEEP GOING

[MySQL] HackerRank : Challenges 본문

code review/sql

[MySQL] HackerRank : Challenges

jmHan 2022. 2. 2. 19:34
반응형

https://www.hackerrank.com/challenges/challenges/problem

 

Challenges | HackerRank

Print the total number of challenges created by hackers.

www.hackerrank.com

 

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 버전에서만 동작한다.  

 

 

 

반응형
Comments