在SQL中按加权评级排序?

时间:2009-12-10 12:17:23

标签: sql

我有一个事件表和另一个评级。每个活动都有很多评级。 我需要能够通过评级从数据库中拉出前三个事件,但当然,评级需要平均,因此一个五星评级的事件评级不高于一个4平均评分和100评级

有人可以指导我如何在SQL中创建它吗?

由于

UPDATE 多谢你们 我想我应该更清楚地知道应该如何加权(尽管我认为我需要更多地思考我希望它如何工作)。 尽管

提供的SQL是一个很好的帮助

5 个答案:

答案 0 :(得分:2)

您的算法描述非常模糊。

此查询将返回底部为100或更低评级的事件:

SELECT  *
FROM    (
        SELECT  e.id, AVG(r.rating) AS ar, COUNT(*) AS cnt
        FROM    event e
        JOIN    rating r
        ON      r.event = e.id
        GROUP BY
                e.id
        ) q
ORDER BY
        CASE WHEN cnt >= 100 THEN 0 ELSE 1 END, ar DESC

答案 1 :(得分:1)

由于您没有提供有关您的DMS的任何细节,因此很难确切地说明如何做到这一点。

但我认为Analytics(仅限ORACLE)正是您所寻找的: http://www.orafaq.com/node/55

答案 2 :(得分:1)

对您的列名和评级系统的规则(非常模糊)做出一些假设,并且还基于MSSQL背景,您可以执行以下操作:

select * from event where id in (
   select top 3 eventid
   from ratings
   group by eventid having count(*)>100 order by avg(rating) desc
)

如果您有很多评分,可能会出于性能原因将此评级值归一化为事件。

答案 3 :(得分:1)

正如其他人所说,你的算法有点模糊。下面的SQL将满足您的需求,但您需要使用您想要的任何排名功能填写____________。

SELECT TOP 3 intId, fltAvgRating, intRatings
FROM (
    SELECT 
        e.intId,
        AVG(CAST(r.intRating AS float)) AS fltAvgRating,
        COUNT(*) AS intRatings
    FROM Event e
        INNER JOIN Rating r ON r.intEventId = e.intId
    GROUP BY e.intId
) AS T
ORDER BY _________ DESC

示例可以是fltAvgRating + LOG(intRatings)

答案 4 :(得分:0)

这有点特定于Oracle,因为它使用ROWNUM,但请尝试

SELECT * FROM
  (SELECT EVENT_ID, EVENT_NAME FROM EVENTS) E
INNER JOIN
  (SELECT EVENT_ID, AVG(RATING) AS AVG_RATING
     FROM EVENT_RATINGS
     GROUP BY EVENT_ID) R
ON (EVENT_ID)
ORDER BY AVG_RATING
WHERE ROWNUM <= 3