题目描述
(通过次数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;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。