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

 

posted @ 2024-01-11 06:18  我是球啊  阅读(14)  评论(0编辑  收藏  举报