[LeetCode] 1633. Percentage of Users Attended a Contest - SQL

Donghyun·2024년 8월 21일
0

Code Kata - SQL

목록 보기
45/61
post-thumbnail

링크: https://leetcode.com/problems/percentage-of-users-attended-a-contest/

Table: Users

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| user_name   | varchar |
+-------------+---------+
user_id is the primary key (column with unique values) for this table.
Each row of this table contains the name and the id of a user.

Table: Register

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| contest_id  | int     |
| user_id     | int     |
+-------------+---------+
(contest_id, user_id) is the primary key (combination of columns with unique values) for this table.
Each row of this table contains the id of a user and the contest they registered into.

Write a solution to find the percentage of the users registered in each contest rounded to two decimals.

Return the result table ordered by percentage in descending order. In case of a tie, order it by contest_id in ascending order.

The result format is in the following example.

Example 1:

Input:
Users table:
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 6       | Alice     |
| 2       | Bob       |
| 7       | Alex      |
+---------+-----------+
Register table:
+------------+---------+
| contest_id | user_id |
+------------+---------+
| 215        | 6       |
| 209        | 2       |
| 208        | 2       |
| 210        | 6       |
| 208        | 6       |
| 209        | 7       |
| 209        | 6       |
| 215        | 7       |
| 208        | 7       |
| 210        | 2       |
| 207        | 2       |
| 210        | 7       |
+------------+---------+
Output:
+------------+------------+
| contest_id | percentage |
+------------+------------+
| 208        | 100.0      |
| 209        | 100.0      |
| 210        | 100.0      |
| 215        | 66.67      |
| 207        | 33.33      |
+------------+------------+
Explanation:
All the users registered in contests 208, 209, and 210. The percentage is 100% and we sort them in the answer table by contest_id in ascending order.
Alice and Alex registered in contest 215 and the percentage is ((2/3) * 100) = 66.67%
Bob registered in contest 207 and the percentage is ((1/3) * 100) = 33.33%

문제풀이

목표: 각 콘테스트에 지원한 사용자의 비율을 구하라

  • 비율은 소수점 둘째 자리까지 반올림
  • 결과는 percentage 를 기준으로 내림차순 정렬, 만약 값이 같다면 contest_id 를 기준으로 오름차순 정렬

최종코드

SELECT
    r.contest_id,
    ROUND(COUNT(r.user_id) / (SELECT COUNT(user_id)
                              FROM Users) * 100, 2) percentage
FROM Register r
    INNER JOIN Users u
    ON r.user_id = u.user_id
GROUP BY r.contest_id 
ORDER BY percentage DESC, contest_id ASC;

설명

나머지는 쉽다. 다만, 등록한 사용자의 비율을 구할 때 분모로 JOIN의 결과와는 무관한 user_id의 총 개수가 필요하기 때문에 서브쿼리로 user_id의 개수를 가져오면 된다.

profile
데이터분석 공부 일기~!

0개의 댓글