家庭作业/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
)