使用带内部连接的组查找列的平均值,然后过滤组
find an average of a column using group with inner join and then filtering through the groups
我一直在尝试解决一个 sqlite 问题,我有两个表:Movies
和 movie_cast
。
电影有以下列:id
、movie_title
和 `score。这是数据示例:
- 11|星球大战|76.496
- 62|2001:Space奥德赛|39.064
- 152|开始跋涉|26.551
movie_cast
包含以下列:movie_id
、cast_id
、cast_name
、birthday
、popularity
。这是一个示例。
11|2|马克·哈米尔|9/25/51|15.015
11|3|哈里森·福特|10/21/56|8.905
11|5|彼得·库欣|05/26/13|6.35
在这种情况下,movies.id
和 movie_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 Harrison Ford 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
列表中的第一个不是您的要求所需要的(如果是则添加它)。
函数 PRINTF()
returns 一个字符串,但是如果你想返回一个数字然后使用 ROUND()
:
ROUND(AVG(m.score), 2) avg_score
我一直在尝试解决一个 sqlite 问题,我有两个表:Movies
和 movie_cast
。
电影有以下列:id
、movie_title
和 `score。这是数据示例:
- 11|星球大战|76.496
- 62|2001:Space奥德赛|39.064
- 152|开始跋涉|26.551
movie_cast
包含以下列:movie_id
、cast_id
、cast_name
、birthday
、popularity
。这是一个示例。
11|2|马克·哈米尔|9/25/51|15.015
11|3|哈里森·福特|10/21/56|8.905
11|5|彼得·库欣|05/26/13|6.35
在这种情况下,movies.id
和 movie_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 Harrison Ford 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
列表中的第一个不是您的要求所需要的(如果是则添加它)。
函数 PRINTF()
returns 一个字符串,但是如果你想返回一个数字然后使用 ROUND()
:
ROUND(AVG(m.score), 2) avg_score