Skip to content

1633. Percentage of Users Attended a Contest

Problem Statement

Table: Users

Column NameType
user_idint
user_namevarchar

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 NameType
contest_idint
user_idint

(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.

Instructions

  • Write a solution to find the percentage of the users registered in each contest rounded to two (2) 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

Input:

Users table:

user_iduser_name
6Alice
2Bob
7Alex

Register table:

contest_iduser_id
2156
2092
2082
2106
2086
2097
2096
2157
2087
2102
2072
2107

Output:

contest_idpercentage
208100.0
209100.0
210100.0
21566.67
20733.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 ((23)×100)=66.67%. Bob registered in contest 207 and the percentage is ((13)×100)=33.33.

Submissions

sql
WITH ContestRegistrations AS (
    SELECT
        contest_id,
        COUNT(DISTINCT user_id) AS registered_users
    FROM
        Register
    GROUP BY
        contest_id
),
TotalUsers AS (
    SELECT
        COUNT(DISTINCT user_id) AS total_users
    FROM
        Users
)
SELECT
    cr.contest_id,
    ROUND((cr.registered_users / CAST(tu.total_users AS DECIMAL)) * 100, 2) AS percentage
FROM
    ContestRegistrations cr, TotalUsers tu
ORDER BY
    percentage DESC,
    contest_id ASC;

Explanations

PostgreSQL
Submitted by @noeyislearning
  • WITH ContestRegistrations AS (...): Create a Common Table Expression (CTE) named ContestRegistrations to get the count of registered users for each contest.
    • SELECT contest_id, COUNT(DISTINCT user_id) AS registered_users: Select the contest_id and the count of distinct user_id from the Register table.
    • FROM Register: Select the Register table.
    • GROUP BY contest_id: Group the result by contest_id.
  • TotalUsers AS (...): Create a CTE named TotalUsers to get the total count of users.
    • SELECT COUNT(DISTINCT user_id) AS total_users: Select the count of distinct user_id from the Users table.
    • FROM Users: Select the Users table.
  • SELECT cr.contest_id, ROUND(...) AS percentage: Select the contest_id and the percentage of registered users for each contest.
    • ROUND((cr.registered_users / CAST(tu.total_users AS DECIMAL)) * 100, 2) AS percentage: Calculate the percentage of registered users for each contest.
  • FROM ContestRegistrations cr, TotalUsers tu: Select the ContestRegistrations and TotalUsers CTEs.
  • ORDER BY percentage DESC, contest_id ASC: Order the result by percentage in descending order and contest_id in ascending order.