题目:各赛事的用户注册率
首先我们观察这两个表以及问题,可以发现: 1.不同赛事是需要进行分别统计的 2.两个表虽然有共同的字段,但是并不需要连接。因为统计一门赛事注册的user_id在Register表中,统计user_id总数量在Users表中,两者都是可以独立查询出来的
那么梳理一下做题步骤: 1.不同赛事进行分组 2.分别统计一门赛事中注册了的user_id数量、user_id总数量 3.保留两位小数 4.结果按percentage降序排序,相同按contest_id的升序排序
select contest_id, round(count(user_id)*100/(select count(*) from users),2)percentage from Register group by contest_id order by percentage desc,contest_id
题目:查询结果的质量和占比
将查询结果的质量 quality 定义为:
各查询结果的评分与其位置之间比率的平均值。
将劣质查询百分比 poor_query_percentage 为:
评分小于 3 的查询结果占全部查询结果的百分比。
编写一组 SQL 来查找每次查询的名称(query_name)、质量(quality) 和 劣质查询百分比(poor_query_percentage)。
质量(quality) 和劣质查询百分比(poor_query_percentage) 都应四舍五入到小数点后两位。
题解
这道题并不难,一张表,直接avg就完了
avg(条件)相当于sum(if(条件,1,0))/count(全体) 进阶 sum(if(条件,N,0))/count(全体) 可用 N*avg(条件)代替
小技巧就是:使用if判断条件,直接复制 100,0 求百分比就不用除以100啦~
使用bool条件将多个样本判断为0和1,多个0和多个1的平均值就是1在整体中的比例,也即满足条件的样本在整体中的比例。
select query_name, round(avg(rating/position),2) quality , round(avg(if(rating<3),100,0),2) poor_query_percentage from queries group by query_name