SQL-聚合函数-1633.各赛事的用户注册率

发布时间 2023-11-30 07:03:11作者: Offer多多

解题思路:

1. 不同赛事是需要进行分别统计的

2. 两个表虽然有共同的字段,但是不需要join,因为统计一门赛事注册的user_id在Register表中,统计user_id总数量在Users表中,两者都是可以独立查询出来的。

做题步骤:

1. 不同赛事进行分组

2. 分别统计一门赛事中注册了的user_id数量、user_id总数量

3. 结果保留两位小数

4. 结果按照percentage降序排序,相同按照context_id升序排序(升序是asc,一般默认,降序是desc)

注意:

1. 100要放在round里面

2. count(1)和count(*)差不多,没什么区别

3. 分子的count(user_id)不需要加distinct,因为(contest_id, user_id)是联合主键,在group by contest_id之后,user_id必然是不会重复的。

4. 联合主键(Composite Primary Key)是指数据库表中的一个由多个列组成的主键。主键的目的是唯一标识表中的每一行数据。当一个主键由多个列组成时,这些列的组合必须唯一标识表中的每一行。通常,每个表都有一个主键,它可以由一个或多个列组成。如果主键由一个列组成,这列称为单列主键。而如果主键由两个或更多列组成,那么就被称为联合主键。使用联合主键的场景可能包括:

1. 复合关系:当表中的数据的唯一性依赖于多个列的组合时,使用联合主键是合适的。例如,一个学生表,唯一标识一个学生可能需要考虑学生的学号和学校的ID。

2. 性能优化:在某些查询中,联合主键的使用可能提供更好的性能。例如,如果某个查询涉及到两个或更多列,而且这些列经常一起使用,那么将它们设置为联合主键可能有助于提高查询性能。

在定义联合主键时,确保组成主键的每一列都不能包含空值(NULL),因为主键的目的是唯一标识每一行数据。

select
    contest_id,
    round(count(user_id) * 100 / (select count(*) from users), 2) as percentage
from
    Register
group by
    contest_id
order by percentage desc, contest_id;