SQL/문제

SQL | Challenges (중복값 조건에 맞춰서 제거)

jjangdoll 2025. 8. 22. 12:32

Challenges 

 

https://www.hackerrank.com/challenges/challenges/problem?isFullScreen=true

 

Challenges | HackerRank

Print the total number of challenges created by hackers.

www.hackerrank.com


 

- challenge_id 갯수가

1) 최댓값이 중복일 경우 : 유지

2) 그 외 중복일 경우 : 제거

 

내가 쓴 답:

WITH A AS(
    SELECT
        h.hacker_id,
        h.name,
        COUNT(c.challenge_id) AS cnt
    FROM
        Hackers h JOIN Challenges c ON h.hacker_id = c.hacker_id
    GROUP BY 1,2),
B AS (
        SELECT
        hacker_id, name, cnt,
        COUNT(*) OVER(PARTITION BY cnt) AS freq,
        RANK() OVER(ORDER BY cnt DESC) AS rum
    FROM A)
SELECT hacker_id, name, cnt
FROM B
WHERE rum = 1 OR freq = 1
ORDER BY cnt DESC, hacker_id;

- CTE1 : challenge_id 개수 + 테이블 조인

- CTE2 : challenge_id 개수를 카운트 → 빈도 / challenge_id 개수 많은순으로 순위 매김 

- 최종 : wherer 조건에서 빈도가 1 or 순위가 1인 놈만 남김


다른 사람이 쓴 답:

WITH cte AS (
    SELECT
    h.hacker_id AS hck,
    h.name AS nam,
    COUNT(challenge_id) AS cnt
FROM
    hackers h
    INNER JOIN challenges c ON c.hacker_id = h.hacker_id
GROUP BY
    h.hacker_id, h.name),   
     cte2 AS (SELECT
        cnt
    FROM
        cte
    WHERE
        cnt < (SELECT MAX(cnt) FROM cte)
    GROUP BY
        cnt
    HAVING
        COUNT(cnt) > 1)  
SELECT
    *
FROM
    cte
WHERE
    cnt NOT IN (SELECT cnt FROM cte2)
ORDER BY
    cnt DESC,hck;

- CTE1 : 나랑 동일

- CTE2 : where 조건에서 challenge_id 개수 최댓값 제외한 cnt / 같은 cnt끼리 그룹핑 / 그룹핑 중 빈도 2 이상만 남김 → 제거 리스트

- 최종 : where 조건에서 CTE2(제거 리스트) 아닌 것들만 출력


ORDER BY로 정리 안 하고 또 계속 정답 처리 안 되길래 지피티 ..^^ 내일 테스트 어케 하려고₩~~~

'SQL > 문제' 카테고리의 다른 글

SQL | OCCUPATIONS (결과물 수직으로 출력)  (0) 2025.08.22
SQL | QCC 6회차  (0) 2025.03.14
SQL | QCC 5회차  (0) 2025.02.28
SQL | QCC 4회차  (0) 2025.01.21
SQL | Binary Tree Nodes, New Companies  (0) 2025.01.17