题目描述

(通过次数15,762 | 提交次数23,218,通过率67.89%)

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

将查询结果的质量 quality 定义为:
各查询结果的评分与其位置之间比率的平均值。
将劣质查询百分比poor_query_percentage 为:
评分小于 3 的查询结果占全部查询结果的百分比。

编写一组 SQL 来查找每次查询的名称(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      |
+------------+-------------------+----------+--------+
Result table:
+------------+---------+-----------------------+
| query_name | quality | poor_query_percentage |
+------------+---------+-----------------------+
| Dog        | 2.50    | 33.33                 |
| Cat        | 0.66    | 33.33                 |
+------------+---------+-----------------------+
Dog 查询结果的质量为 ((5 / 1) + (5 / 2) + (1 / 200)) / 3 = 2.50
Dog 查询结果的劣质查询百分比为 (1 / 3) * 100 = 33.33
Cat 查询结果的质量为 ((2 / 5) + (3 / 3) + (4 / 7)) / 3 = 0.66
Cat 查询结果的劣质查询百分比为 (1 / 3) * 100 = 33.33

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/queries-quality-and-percentage
//测试数据
Create table If Not Exists Queries (query_name varchar(30), result varchar(50), position int, rating int);

insert into Queries (query_name, result, position, rating) values ('Dog', 'Golden Retriever', '1', '5');
insert into Queries (query_name, result, position, rating) values ('Dog', 'German Shepherd', '2', '5');
insert into Queries (query_name, result, position, rating) values ('Dog', 'Mule', '200', '1');
insert into Queries (query_name, result, position, rating) values ('Cat', 'Shirazi', '5', '2');
insert into Queries (query_name, result, position, rating) values ('Cat', 'Siamese', '3', '3');
insert into Queries (query_name, result, position, rating) values ('Cat', 'Sphynx', '7', '4');

解题思路

Queries表中保存了所有的查询,包括查询的位置、评分。

其中,查询的质量为评分与位置的比率的平均值;而劣质查询指的是评分小于3的查询。

题目要求:返回每个查询的名称、质量、劣质查询占比。

因为Queries表中一个查询会有多条记录,而查询结果要求每个查询返回一条。因此,需要使用GROUP BY进行分组汇总。

计算质量时,可以先计算每条记录的评分与位置的比率,然后使用AVG计算平均值。

计算劣质查询占比时,可以先计算出劣质查询数与查询总数,再计算占比。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select
    query_name,
    round(avg(rating/position),2) quality,
    round(sum(case when rating<3 then 1 else 0 end)*100/count(1),2) poor_query_percentage
from Queries
group by query_name;
picture loss