题目描述

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

查询表 Queries:
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| query_name | varchar |
| result | varchar |
| position | int |
| rating | int |
+-------------+---------+
此表没有主键,并可能有重复的行。
此表包含了一些从数据库中收集的查询信息。
“位置”(position)列的值为 1500
“评分”(rating)列的值为 15 。评分小于 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
查询表 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
查询表 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');
//测试数据 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');
//测试数据
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;
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;
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