按平均sql排序列

时间:2015-03-16 03:24:48

标签: sql sql-server

我有一个包含ReviewsMovieID列的表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

3 个答案:

答案 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;