Basic Join / Intermediate
문제
- hacker_id, name, 도전과제 총 수 출력
- 결과는 도전과제 총 수(내림차순), 도전과제 총 수가 동일하면 hacker_id로 추가 정렬
- 단, 도전과제 수가 동일하고, 그 수가 최대 도전과제 수보다 작은 경우 해당 학생은 결과에서 제외
풀이
- 이 문제의 핵심은 세 번째 조건이며 FROM 절에 서브쿼리를 사용하여 해결한다.
- 먼저 해커아이디/이름 기준으로 groupby 하여 challenge_id를 count()하여 totalcount를 구한다
- 다음으로 세번째 조건을 필터링 하기 위해 총 도전과제 수의 중복 수와 전체 도전과제 수 중 최댓값을 구해야한다
- 도전과제 중복수 : COUNT(challenge_id) 별로 몇 번이나 값이 나왔는지(중복되었는지) 윈도우 함수를 사용
👉 count() 결과 자체를 한 번 더 Count() 한다는 점에서 독특하게 풀이할 수 있음! - 전체 도전과제의 최댓값 : COUNT(challenge_id) 가 전체 행에서 갖는 최댓값을 윈도우 함수를 사용하여 도출
- 도전과제 중복수 : COUNT(challenge_id) 별로 몇 번이나 값이 나왔는지(중복되었는지) 윈도우 함수를 사용
- WHERE 절에 조건 걸기 : 중복이 발생하며(dup >1) 그 중복값이 max 보다 작은 경우(totalcount < max)는 결과에서 제외(NOT)\
- ORDER BY 로 마무리
SELECT hacker_id, name, totalcount
FROM (
SELECT H.hacker_id,
name,
COUNT(challenge_id) as totalcount,
COUNT(COUNT(challenge_id)) OVER (PARTITION BY COUNT(challenge_id)) as dup,
MAX(COUNT(challenge_id)) OVER () as max
FROM Hackers as H
LEFT JOIN Challenges as C ON H.hacker_id = C.hacker_id
GROUP BY 1, 2
) A
WHERE NOT (dup > 1 AND totalcount < max)
ORDER BY 3 DESC, 1
728x90
'SQL > SQL test' 카테고리의 다른 글
[HackerRank] SQL Project Planning (0) | 2024.01.17 |
---|---|
[HackerRank] Contest Leaderboard (0) | 2024.01.16 |
[HackerRank] The Report (INNER JOIN - BETWEEN) (0) | 2024.01.15 |
[HackerRank] Weather Observation Station 5(UNION) (1) | 2024.01.15 |
[HackerRank] Weather Observation Station 20(중앙값) (0) | 2024.01.15 |