我有一个包含Reviews
和MovieID
列的表Rating
。
在此表中,评级与特定的MovieID相关联。
例如,MovieID 123可以有500个等级,范围从1-5。
我希望以最高格式显示N-Top电影,其平均评分最高(四舍五入到小数点后四位),格式为:
movieID|avg
123 : 4.06
512 : 4.01
744 : 3.68
23 : 2.51
此查询是否是正确的方法?
SELECT MovieID, ROUND(AVG(CAST(Rating AS FLOAT)), 4) as avg
from Reviews order by avg desc
答案 0 :(得分:2)
这不是正确的方法。当您使用像avg()
这样的聚合函数时,您需要包含一个group by
子句,用于确定应该应用该函数的项目。
在你的情况下,你应该做
SELECT TOP 5
MovieID, ROUND(AVG(CAST(Rating AS FLOAT)), 4) as avg
FROM Reviews
GROUP BY MovieID
ORDER BY ROUND(AVG(CAST(Rating AS FLOAT)), 4) DESC
获得前5名的评分。 TOP 5
限制了由order by
子句确定的返回前5的记录。
请注意,如果排名前6的电影恰好具有相同的平均评分,那么你仍然只能获得5个(并且未确定其中的6个中的哪5个)。如果您希望将关系计为1,那么您应该查看rank()
函数。
答案 1 :(得分:1)
以下是解决问题的查询:
SELECT MovieID, ROUND(AVG(rating),4) AS avg
FROM your_table
GROUP BY MovieID
ORDER BY ROUND(AVG(rating),4) DESC LIMIT 4
在这里,我从上面的示例输出中获取了N = 4
。此外,您需要将此查询中的your_table
替换为表的实际名称。您的原始查询方向错误,因为它没有使用GROUP BY
函数来查找每部电影的平均评分。
答案 2 :(得分:1)
以下可能效果更好:
Table
"input" with data:
movieId:rating
A : 4
A : 5
B : 2
然后查询将是:
SELECT ROUND(AVG(rating),4) as avg_rating, movieId
FROM input
GROUP BY movieId
ORDER BY AVG(rating) DESC;