Allen's 데이터 맛집
HackerRank lv. Medium : Challenges 본문
문제
풀이
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로 오름차순으로 추가 정렬합니다.