力扣数据库算法1211. 查询结果的质量和占比

SQL:

select query_name,  
        round(avg(rating / position), 2) as quality,  
        round(avg(if(rating < 3, 1, 0) * 100), 2) as poor_query_percentage 
from queries 
where query_name is not null 
group by query_name

描述:

Queries 表: 

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| query_name  | varchar |
| result      | varchar |
| position    | int     |
| rating      | int     |
+-------------+---------+
此表可能有重复的行。
此表包含了一些从数据库中收集的查询信息。
“位置”(position)列的值为 1500 。
“评分”(rating)列的值为 15 。评分小于 3 的查询被定义为质量很差的查询。

将查询结果的质量 quality 定义为:

各查询结果的评分与其位置之间比率的平均值。

将劣质查询百分比 poor_query_percentage 为:

评分小于 3 的查询结果占全部查询结果的百分比。

编写解决方案,找出每次的 query_name 、 quality 和 poor_query_percentage

quality 和 poor_query_percentage 都应 四舍五入到小数点后两位 。

以 任意顺序 返回结果表。

示例:

输入:
Queries table:
+------------+-------------------+----------+--------+
| query_name | result            | position | rating |
+------------+-------------------+----------+--------+
| Dog        | Golden Retriever  | 1        | 5      |
| Dog        | German Shepherd   | 2        | 5      |
| Dog        | Mule              | 200      | 1      |
| Cat        | Shirazi           | 5        | 2      |
| Cat        | Siamese           | 3        | 3      |
| Cat        | Sphynx            | 7        | 4      |
+------------+-------------------+----------+--------+
输出:
+------------+---------+-----------------------+
| query_name | quality | poor_query_percentage |
+------------+---------+-----------------------+
| Dog        | 2.50    | 33.33                 |
| Cat        | 0.66    | 33.33                 |
+------------+---------+-----------------------+

分析:

此题的关键在于质量与劣质查询百分比的计算,这两个计算都可以用sql当中的avg()函数来实现。

质量计算为计算各查询结果的评分与其位置之间比率的平均值所以直接用avg(评分/位置)就可以,再使用round函数进行保留两位小数。

round(avg(rating / position), 2) as quality

劣质查询百分比的计算需要算出劣质查询即评分小于 3 的查询结果占全部查询结果的百分比,百分比的计算其实就是(劣质查询 / 全部查询结果 * 100),全部的查询结果可以看作劣质查询 + 其他查询,可以用sql中的if来实现,即if(rating < 3, 1, 0)该算式表明若此查询为劣质查询则赋值1,若不是则赋值0,再对其进行平均值计算就可得出答案。

round(avg(if(rating < 3, 1, 0) * 100), 2) as poor_query_percentage

最后对查询名称做一个分组就完成了,即:

select query_name,  
        round(avg(rating / position), 2) as quality,  
        round(avg(if(rating < 3, 1, 0) * 100), 2) as poor_query_percentage 
from queries 
group by query_name

但此时提交后发现有查询名称为null的情况,所以需要再加一个筛选条件,名称不为null,所以最终答案为:

select query_name,  
        round(avg(rating / position), 2) as quality,  
        round(avg(if(rating < 3, 1, 0) * 100), 2) as poor_query_percentage 
from queries 
where query_name is not null 
group by query_name

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值