Sql 收视率最高的电影?

Sql 收视率最高的电影?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,找到平均收视率最高的电影。返回电影标题和平均收视率 我尝试了这个,但卡住了,因为我无法检索mid,如果我添加mid,maxavg_星,那么它将给出每个mid的最大值,我只需要一个最大值 例外输出白雪公主4.5,如果两部电影拥有相同的maxavg_明星,我该如何处理。您可能可以优化或想出更干净的东西,但这是可行的: SELECT TOP 1 MAX(m.title) AS title, AVG(stars) AS averageStars FROM rating r JOIN movie m

找到平均收视率最高的电影。返回电影标题和平均收视率

我尝试了这个,但卡住了,因为我无法检索mid,如果我添加mid,maxavg_星,那么它将给出每个mid的最大值,我只需要一个最大值


例外输出白雪公主4.5,如果两部电影拥有相同的maxavg_明星,我该如何处理。

您可能可以优化或想出更干净的东西,但这是可行的:

SELECT TOP 1 MAX(m.title) AS title, AVG(stars) AS averageStars
FROM rating r
JOIN movie m
    ON r.mId = m.mId
GROUP BY r.mId
ORDER BY AVG(stars) DESC, 
          --Order by a seond column of your 
          --choice to break ties for AVG(stars)
         MAX(m.title)
SELECT m.title, AVG(r.stars) AS AverageStars
FROM       Rating AS r (NOLOCK)
INNER JOIN Movie  AS m (NOLOCK) ON m.mID = r.mID
GROUP BY r.mID, m.Title
HAVING AVG(r.stars) =
(
    SELECT TOP 1 AVG(stars) AS AverageStars
    FROM Rating (NOLOCK)
    GROUP BY mID
    ORDER BY AverageStars DESC
)
试试这个:

输出:

   MID    TITLE         AVG_STARS
   106    Snow White    4.5

这将完美地满足您的目的&性能-

SELECT
    Title
    ,AVG_RATING
FROM
(
    SELECT
        M.Title
        ,M.mID
        ,CAST(ROUND(AVG(R.stars),2) AS DECIMAL(10,2)) AS AVG_RATING
        ,RANK() OVER (ORDER BY AVG(R.stars) DESC) RATING_RANK
    FROM Movie M
    INNER JOIN Rating R
        ON M.mID = R.mID
    GROUP BY M.Title,M.mID
)RANKED_RATING
WHERE RATING_RANK = 1
您可能需要在演员阵容中进行一些调整,以适应您的表格定义


注意-如果两部或更多的电影具有最高的平均评级-所有电影都将排名第一,所有电影都将被选中。如果您仍然只需要一个-您将需要定义一个规则,以确定要选择哪一个。

在其中,条件SELECT MAXstars FROM Rating中的子查询将对每一行每次进行计算。这不是正确的方法。我重读了一遍,OP也要求那些平均值最高的。我读到的和max的一样,所以我也给出了一个不正确的答案。道歉。将重新发布一个更正的答案。@NeilCresswell我想要的是星星的平均值,而不是一个平均值。现在,all with max average而不是all with max。您选择的TOP 1是否只返回一条记录,而不是所有符合最高平均值标准的记录?是的。我不确定当一个以上的电影有最高的最高平均值时,OP想要如何考虑案例。所以我决定只归还一部平均水平最高的电影。啊,这是一个有趣的问题我不确定您对这里的业务/UI案例有多大的控制权,但我认为从可用性的角度来看,还可以向用户提供给定的评分数量。一个5星级的评价往往远不如100个4星级的评价可靠。有点离题,但我相信这一点值得一提。甚至可能仅仅获得最高评级将返回多个单评级电影,这可能并不能真正满足此查询的原始目的。
   MID    TITLE         AVG_STARS
   106    Snow White    4.5
SELECT
    Title
    ,AVG_RATING
FROM
(
    SELECT
        M.Title
        ,M.mID
        ,CAST(ROUND(AVG(R.stars),2) AS DECIMAL(10,2)) AS AVG_RATING
        ,RANK() OVER (ORDER BY AVG(R.stars) DESC) RATING_RANK
    FROM Movie M
    INNER JOIN Rating R
        ON M.mID = R.mID
    GROUP BY M.Title,M.mID
)RANKED_RATING
WHERE RATING_RANK = 1