본문 바로가기
SQL/SQL test

[HackerRank] Challenges

by ISLA! 2024. 1. 16.

Basic Join / Intermediate

 

문제

  • hacker_id, name, 도전과제 총 수 출력
  • 결과는 도전과제 총 수(내림차순), 도전과제 총 수가 동일하면 hacker_id로 추가 정렬
  • 단, 도전과제 수가 동일하고, 그 수가 최대 도전과제 수보다 작은 경우 해당 학생은 결과에서 제외


풀이

  • 이 문제의 핵심은 세 번째 조건이며 FROM 절에 서브쿼리를 사용하여 해결한다.
  • 먼저 해커아이디/이름 기준으로 groupby 하여 challenge_id를 count()하여 totalcount를 구한다
  • 다음으로 세번째 조건을 필터링 하기 위해 총 도전과제 수의 중복 수와 전체 도전과제 수 중 최댓값을 구해야한다
    • 도전과제 중복수 : COUNT(challenge_id) 별로 몇 번이나 값이 나왔는지(중복되었는지) 윈도우 함수를 사용
      👉 count() 결과 자체를 한 번 더 Count() 한다는 점에서 독특하게 풀이할 수 있음!
    • 전체 도전과제의 최댓값 : 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