力扣sql练习:各赛事的用户注册率、查询结果的质量和占比

141 阅读2分钟

题目:各赛事的用户注册率

各赛事的用户注册率-条件与输出结构.png

首先我们观察这两个表以及问题,可以发现: 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) 都应四舍五入到小数点后两位。

查询结果质量与占比.png

题解

这道题并不难,一张表,直接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