使用具有内部联接的组来查找列的平均值,然后通过组进行过滤

问题描述

我一直在尝试解决一个sqlite问题,其中有两个表:Moviesmovie_cast

电影具有以下列:idmovie_title和`score。这是数据示例:

  • 11 |星球大战| 76.496
  • 62 | 2001:太空漫游| 39.064
  • 152 |开始跋涉| 26.551

movie_cast具有以下列:movie_idcast_idcast_namebirthdaypopularity。这是一个示例。

  • 11 | 2 |马克·哈米尔| 9/25/51 | 15.015

  • 11 | 3 |哈里森·福特| 10/21/56 | 8.905

  • 11 | 5 | Peter Cushing | 05/26/13 | 6.35

在这种情况下,movies.idmovie_cast.movie_id是相同的。 问题是查找平均电影得分最高的前十名演员。 平均分数计算中不要包括分数小于25的电影。 ▪排除出演过两部或以下电影的演员。

我的查询如下,但似乎并没有找到正确的答案。

SELECT movie_cast.cast_id,movie_cast.cast_name,printf("%.2f",CAST(AVG(movies.score) as float)),COUNT(movie_cast.cast_name)
FROM movies
INNER JOIN movie_cast ON movies.id = movie_cast.movie_id
WHERE movies.score >= 25
GROUP BY movie_cast.cast_id
HAVING COUNT(movie_cast.cast_name) > 2 
ORDER BY AVG(movies.score ) DESC,movie_cast.cast_name ASC
LIMIT 10  

我得到的答案的格式为cast_id,cat_name,avg score

-例如:3哈里森·福特52.30

我已经分析并重新分析了我的逻辑,但无济于事。我不确定我要去哪里。任何帮助将是巨大的! 谢谢!

解决方法

这就是我编写查询的方式:

SELECT mc.cast_id,mc.cast_name,PRINTF('%.2f',AVG(m.score)) avg_score
FROM movie_cast mc INNER JOIN movies m 
ON m.id = mc.movie_id
WHERE m.score >= 25
GROUP BY mc.cast_id,mc.cast_name
HAVING COUNT(*) > 2
ORDER BY AVG(m.score) DESC,mc.cast_name ASC
LIMIT 10;

我为表使用别名来缩短代码并使其更具可读性。
无需将平均值强制转换为浮点数,因为SQLite中的平均值始终为实数。
两个COUNT(movie_cast.cast_name)都可以简化为COUNT(*),但是SELECT列表中的第1个不是您所需要的(如果需要,则将其添加)。
函数PRINTF()返回一个字符串,但是如果您想返回一个数字,请使用ROUND()

ROUND(AVG(m.score),2) avg_score