我有一个事件表和另一个评级。每个活动都有很多评级。 我需要能够通过评级从数据库中拉出前三个事件,但当然,评级需要平均,因此一个五星评级的事件评级不高于一个4平均评分和100评级
有人可以指导我如何在SQL中创建它吗?
由于
UPDATE 多谢你们 我想我应该更清楚地知道应该如何加权(尽管我认为我需要更多地思考我希望它如何工作)。 尽管
提供的SQL是一个很好的帮助答案 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