Challenges

VIEW and JOIN

Question Link

Julia asked her students to create some coding challenges. Write a query to print the hacker_id, name, and the total number of challenges created by each student. Sort your results by the total number of challenges in descending order. If more than one student created the same number of challenges, then sort the result by hacker_id. If more than one student created the same number of challenges and the count is less than the maximum number of challenges created, then exclude those students from the result.

Input Format

The following tables contain challenge data:

  • Hackers: The hacker_id is the id of the hacker, and name is the name of the hacker.

  • Challenges: The challenge_id is the id of the challenge, and hacker_id is the id of the student who created the challenge.


Sample Input 0

Sample Output 0

21283 Angela 6
88255 Patrick 5
96196 Lisa 1

Sample Input 1

Sample Output 1

12299 Rose 6
34856 Angela 6
79345 Frank 4
80491 Patrick 3
81041 Lisa 1

Explanation

/*
Write a query to print the hacker_id, name, and the total number of challenges created 
by each student. Sort your results by the total number of challenges in descending order.
If more than one student created the same number of challenges, then sort the result by
hacker_id. If more than one student created the same number of challenges and the count
is less than the maximum number of challenges created, then exclude those students from
the result.
*/

WITH temp AS (
    SELECT 
        h.hacker_id, 
        h.name, 
        COUNT(c.challenge_id) cnt
    FROM Hackers h 
    INNER JOIN Challenges c
    ON h.hacker_id = c.hacker_id
    GROUP BY h.hacker_id, h.name
    ORDER BY cnt DESC, h.hacker_id
    )

SELECT * 
FROM temp
WHERE (temp.cnt = (SELECT MAX(cnt) FROM temp)) OR 
      (1 = (SELECT COUNT(cnt) FROM temp u WHERE temp.cnt = u.cnt));
      
-- OR

WITH rankings AS (
    SELECT
        h.hacker_id,
        h.name,
        COUNT(c.challenge_id) AS total_challenges,
        COUNT(*) OVER(PARTITION BY COUNT(c.challenge_id)) AS total_chall_count
    FROM hackers h
    LEFT JOIN challenges c
    ON h.hacker_id = c.hacker_id
    GROUP BY 1,2
    ORDER BY COUNT(c.challenge_id) DESC, hacker_id
    )
SELECT
    hacker_id,
    name,
    total_challenges
FROM rankings 
WHERE total_challenges = (SELECT MAX(total_challenges) FROM rankings)
    OR total_chall_count = 1

Last updated