【问题标题】:Order a column by average sql按平均sql排序一列
【发布时间】:2015-03-16 03:24:48
【问题描述】:

我有一个表 Reviews 与列 MovieIDRating

在此表中,评级与特定的 MovieID 相关联。

例如,MovieID 123 可以有 500 个等级,范围从 1 到 5。

我想在顶部显示 N-Top 电影,平均评分最高(四舍五入到小数点后 4 位),格式为:

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

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这不是正确的做法。当你使用像 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() 函数。

    【讨论】:

      【解决方案2】:

      以下可能会更好:

      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;
      

      【讨论】:

        【解决方案3】:

        这是可以解决您的问题的查询:

        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 函数来查找每部电影的平均评分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-02
          • 1970-01-01
          • 2011-10-24
          • 2012-06-28
          • 1970-01-01
          相关资源
          最近更新 更多