家庭作业/sqlite3 平均结果奇怪
homework / sqlite3 avg outcome strange
我的任务是使用 imdb movies.db 文件编写 SQL 查询以确定 2012 年发行的所有电影的平均评分。
此查询的值在两个表中:
Table 1 部电影 /
id 整数 /
标题 TEXT NOT NULL /
年 数字
Table 2 个评分 /
movie_id 整数不为空 /
评分 实数 非空 /
投票 整数不为空
我的方法是一步步接近想要的结果。所以目前我有一个列表 - 为更好地概述而限制 - 2012 年发行的电影评级。我想计算这些评级的平均值,因为结果是错误的,我检查了它的总和,我得到了很奇怪的数字。
谁能给我解释一下这里发生了什么?
picture of code and outcome
查询:
SELECT SUM(rating)
FROM ratings JOIN movies
ON ratings.movie_id = movies.id
WHERE year = 2012
原样,没有 LIMIT
,returns 只有 1 行,这是 all 的总和all 2012 年的电影。
所以应用 LIMIT 15
不会影响结果。
如果您想要 15 个评分的总和,您应该这样做:
SELECT SUM(rating)
FROM (
SELECT ratings.rating
FROM ratings JOIN movies
ON ratings.movie_id = movies.id
WHERE year = 2012
LIMIT 15
)
子查询只会获得 15 个评分,然后 return 它们的总和。
同样适用于平均值:
SELECT AVG(rating)
FROM (
SELECT ratings.rating
FROM ratings JOIN movies
ON ratings.movie_id = movies.id
WHERE year = 2012
LIMIT 15
)
在任何情况下使用不带 ORDER BY
子句的 LIMIT
都不是一个好的选择,因为您永远不知道哪些行将被 returned,所以结果是未定义的。
所以最好对行进行排序,比如按电影的 id,然后应用 LIMIT
:
SELECT AVG(rating)
FROM (
SELECT ratings.rating
FROM ratings JOIN movies
ON ratings.movie_id = movies.id
WHERE year = 2012
ORDER BY movies.id LIMIT 15
)
我的任务是使用 imdb movies.db 文件编写 SQL 查询以确定 2012 年发行的所有电影的平均评分。
此查询的值在两个表中:
Table 1 部电影 / id 整数 / 标题 TEXT NOT NULL / 年 数字
Table 2 个评分 / movie_id 整数不为空 / 评分 实数 非空 / 投票 整数不为空
我的方法是一步步接近想要的结果。所以目前我有一个列表 - 为更好地概述而限制 - 2012 年发行的电影评级。我想计算这些评级的平均值,因为结果是错误的,我检查了它的总和,我得到了很奇怪的数字。
谁能给我解释一下这里发生了什么?
picture of code and outcome
查询:
SELECT SUM(rating)
FROM ratings JOIN movies
ON ratings.movie_id = movies.id
WHERE year = 2012
原样,没有 LIMIT
,returns 只有 1 行,这是 all 的总和all 2012 年的电影。
所以应用 LIMIT 15
不会影响结果。
如果您想要 15 个评分的总和,您应该这样做:
SELECT SUM(rating)
FROM (
SELECT ratings.rating
FROM ratings JOIN movies
ON ratings.movie_id = movies.id
WHERE year = 2012
LIMIT 15
)
子查询只会获得 15 个评分,然后 return 它们的总和。
同样适用于平均值:
SELECT AVG(rating)
FROM (
SELECT ratings.rating
FROM ratings JOIN movies
ON ratings.movie_id = movies.id
WHERE year = 2012
LIMIT 15
)
在任何情况下使用不带 ORDER BY
子句的 LIMIT
都不是一个好的选择,因为您永远不知道哪些行将被 returned,所以结果是未定义的。
所以最好对行进行排序,比如按电影的 id,然后应用 LIMIT
:
SELECT AVG(rating)
FROM (
SELECT ratings.rating
FROM ratings JOIN movies
ON ratings.movie_id = movies.id
WHERE year = 2012
ORDER BY movies.id LIMIT 15
)