sqlite3统计2012年IMDB电影平均评分时计算结果异常求助
结果异常的核心原因
你遇到的求和数值失真、平均值计算偏差,根本原因是多表关联做统计时出现了重复行累积,常见的触发情况有两种:
- 关联条件写错导致笛卡尔积匹配:本来1条MOVIES的记录应该对应1条相同ID的RATINGS记录,因为漏写关联条件、关联字段匹配错误,会让1部2012年的电影被匹配到几十甚至上百条重复的评分数据,最后聚合求和时把同一条rating反复累加,算出来的总和会远高于真实值,得到的平均值自然和预期不符。
- 计算求和时选错了字段:RATINGS表里的
votes字段是对应评分的投票总人数,数值远大于0-10分区间的rating本身,如果误把这个字段和rating加在一起算总和,也会得到明显异常的求和结果。
正确的查询实现
要准确统计2012年上映电影的平均评分,只要严格匹配表间关联关系、明确筛选上映年份的条件即可,参考SQL写法:
SELECT AVG(rating) AS avg_rating_2012 FROM MOVIES INNER JOIN RATINGS ON MOVIES.id = RATINGS.movie_id WHERE MOVIES.year = 2012;
如果需要核查求和值是否准确,可以替换聚合函数做交叉验证:
SELECT SUM(rating) AS total_rating_sum, COUNT(rating) AS counted_movie_num FROM MOVIES INNER JOIN RATINGS ON MOVIES.id = RATINGS.movie_id WHERE MOVIES.year = 2012;
用得到的总评分和除以统计的电影数量,就能和之前算出的平均值做比对,快速排查是不是出现了重复行累积的问题。
内容的提问来源于stack exchange,提问作者Anna Jsk
相关产品推荐
相关产品推荐

