Allen's 데이터 맛집

HackerRank lv. Medium : Challenges 본문

SQL/SQL 문제풀이

HackerRank lv. Medium : Challenges

Allen93 2024. 5. 25. 18:06

문제

 

 

 

풀이

 

Julia는 그녀의 학생들에게 코딩 챌린지를 만들도록 요청했습니다. 이 문제에서는 각 학생이 생성한 챌린지의 수를 분석하고, 결과를 챌린지 수에 따라 내림차순으로 정렬하여 출력하는 SQL 쿼리를 작성해야 합니다. 또한, 같은 수의 챌린지를 생성한 학생이 여럿인 경우 최대 생성 수를 제외하고 해당 학생들을 결과에서 제외해야 합니다. 

 

WITH data AS (
    SELECT 
        c.hacker_id AS id,
        h.name AS name,
        COUNT(c.hacker_id) AS counter
    FROM 
        Hackers h
        JOIN Challenges c ON c.hacker_id = h.hacker_id
    GROUP BY
        c.hacker_id, h.name
)

SELECT 
    id,
    name,
    counter
FROM 
    data
WHERE
    counter = (SELECT MAX(counter) FROM data) /* 학생들 중 최대 챌린지 수를 가진 학생만 선택 */
    OR
    counter IN (
        SELECT counter FROM data
        GROUP BY 
            counter
        HAVING 
            COUNT(counter) = 1 /* 동일한 챌린지 수를 가진 학생이 유일한 경우만 선택 */
    )
ORDER BY
    counter DESC, id;

 

 

1. WITH 절 (data CTE): Hackers와 Challenges 테이블을 조인하여 각 학생(hacker_id)과 그들의 이름(name)별로 챌린지를 카운트(counter)합니다. 이 결과는 임시 테이블 data로 저장됩니다.


2. SELECT 절: data 테이블에서 학생들을 선택합니다. 조건은 두 가지입니다:
학생이 만든 챌린지 수가 전체에서 최대인 경우.
챌린지 수가 유일하게 카운트된 경우만 선택합니다(즉, 그 수의 챌린지를 만든 학생이 단 한 명인 경우).


3. WHERE 절: 두 개의 조건을 통해 데이터를 필터링합니다. 최대값을 가진 챌린지 수 또는 그룹 내에서 유일한 챌린지 수를 가진 데이터만 선택합니다.


4. ORDER BY 절: 챌린지 수(counter)에 따라 내림차순으로 정렬하고, 동일한 경우 hacker_id로 오름차순으로 추가 정렬합니다.