2009-12-10 33 views
2

我有一個事件表和另一個評級。每個事件可以有很多評級。 我需要能夠通過評分從數據庫中提取前三名活動,但當然,評分需要進行平均,所以具有一個五星級評分的活動的評分不會高於具有四個平均評分和100分收視率。按SQL中的加權評分排序?

任何人都可以指導我如何在SQL中創建?

感謝

UPDATE 謝謝你們 我想我應該是更清楚的事情應該怎麼進行加權(雖然我覺得我應該更多地對我怎麼想的正是這種工作)。 SQL提供了很大的幫助,雖然

+0

你想如何排序這些事件:100評級,平均5,100評級,平均4,99評級,平均5. – Quassnoi 2009-12-10 12:30:30

+0

我想我會希望他們按照你給他們的順序排序。需要給這個想法... – Sergio 2009-12-10 14:44:56

回答

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 
) 

你可能想,如果你有很多的收視率在未來的這個評價值非規範化爲事件出於性能的考慮

+0

認爲這是接近什麼病使用(使用MS SQL Server) – Sergio 2009-12-10 14:45:43

1

因爲你沒有提供任何關於你的DBMS的細節,所以很難說你如何做到這一點。

但我認爲Analytics(分析)(僅限於Oracle)是你在找什麼: http://www.orafaq.com/node/55

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 
0

這有點甲骨文具體,因爲它使用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 
+0

這甚至不解析。 – Quassnoi 2009-12-10 12:40:34

+0

我認爲它傳達了這個想法,儘管語法是關閉的。如何: SELECT EVENT_ID,EVENT_NAME,AVG_RATING FROM事件E INNER JOIN (SELECT EVENT_ID,AVG(RATING)AS AVG_RATING FROM EVENT_RATINGS GROUP BY EVENT_ID)R USING(EVENT_ID) WHERE ROWNUM <= 3 ORDER BY AVG_RATING 分享和享受。 – 2009-12-11 15:23:25

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)