1211. Queries Quality and Percentage
这道题目不难,但是有很多需要考虑的点以及容易写错的地方。
SELECT query_name, ROUND(AVG(rating/position), 2) AS quality, ROUND(SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END) * 100 / COUNT(*), 2) AS poor_query_percentage FROM Queries GROUP BY query_name HAVING query_name IS NOT NULL;
问题出在第三行和最后一行,最后一行是因为可能存在query_name为null的情况,主键列通常不允许包含NULL值。
首先一起复习一下MySQL中的函数:
SUM():返回某列的和
AVG():返回某列的均值
COUNT():返回某列的行数
MAX(), MIN():返回某列的最大/小值
第三行中,计算劣质查询百分比,即评分小于3的查询结果占所有结果的百分比
评分小于3的数量可以用SUM和IF,如果rating小于3,那么数量加一,所有查询结果可以使用COUNT,因为要求的是百分比,所以需要乘以100.
SUM(IF(rating < 3), 1, 0)) * 100 / COUNT(*)
或者也可以使用AVG:
AVG(rating < 3) * 100
为了规范性,我们还是使用CASE WHEN:
AVG(CASE WHEN rating < 3 THEN 1 ELSE 0 END) * 100
或者麻烦一点写:
SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END) / COUNT(*) * 100