我有一個MS SQL Server 2008數據庫,用於存儲供應食物的地方(咖啡廳,餐館,食客等)。在連接到這個數據庫的網站上,人們可以評分從1到3的比例。計算存儲過程中的加權(貝葉斯)平均分數/指數?
在網站上有一個頁面,人們可以查看排名前25的頂級名單(最好評級)某個城市。數據庫結構看起來像這樣(有表中存儲更多的信息,但這裏的相關信息):
的地方坐落在一個城市和票放在一個地方。
到目前爲止,我剛剛計算了每個地方的平均投票分數,我將某個地方的所有選票總數與該地點的投票數相除,如下所示(僞代碼):
vote_count = total number of votes for the place
vote_sum = total sum of all the votes for the place
vote_score = vote_sum/vote_count
如果一個地方沒有投票,我還必須處理除以零。所有這些都是在存儲過程中完成的,該存儲過程獲取我想要顯示在頂部列表中的其他數據。這裏是取前25位最高的投得分當前存儲過程:
ALTER PROCEDURE [dbo].[GetTopListByCity]
(
@city_id Int
)
AS
SELECT TOP 25 dbo.Places.place_id,
dbo.Places.city_id,
dbo.Places.place_name,
dbo.Places.place_alias,
dbo.Places.place_street_address,
dbo.Places.place_street_number,
dbo.Places.place_zip_code,
dbo.Cities.city_name,
dbo.Cities.city_alias,
dbo.Places.place_phone,
dbo.Places.place_lat,
dbo.Places.place_lng,
ISNULL(SUM(dbo.Votes.vote_score),0) AS vote_sum,
(SELECT COUNT(*) FROM dbo.Votes WHERE dbo.Votes.place_id = dbo.Places.place_id) AS vote_count,
COALESCE((CONVERT(FLOAT,SUM(dbo.Votes.vote_score))/(CONVERT(FLOAT,(SELECT COUNT(*) FROM dbo.Votes WHERE dbo.Votes.place_id = dbo.Places.place_id)))),0) AS vote_score
FROM dbo.Places INNER JOIN dbo.Cities ON dbo.Places.city_id = dbo.Cities.city_id
LEFT OUTER JOIN dbo.Votes ON dbo.Places.place_id = dbo.Votes.place_id
WHERE dbo.Places.city_id = @city_id
AND dbo.Places.hidden = 0
GROUP BY dbo.Places.place_id,
dbo.Places.city_id,
dbo.Places.place_name,
dbo.Places.place_alias,
dbo.Places.place_street_address,
dbo.Places.place_street_number,
dbo.Places.place_zip_code,
dbo.Cities.city_name,
dbo.Cities.city_alias,
dbo.Places.place_phone,
dbo.Places.place_lat,
dbo.Places.place_lng
ORDER BY vote_score DESC, vote_count DESC, place_name ASC
RETURN
正如你可以看到它獲取的不僅僅是投得分更多 - 我需要的地方去的數據,全市它位於等等。這工作正常,但有一個大問題:投票分數太簡單了,因爲它沒有考慮到投票數。與簡單的計算方法,它具有一票比分3將在列表中較有十四票比分3和比分2一票的地方結束了更高的地方:
3/1 = 3
(14*3 + 1*2) = 44/15 = 2.933333333333
要解決我一直在研究使用某種形式的加權平均/加權指數。我發現了一個看起來很有前途的真實貝葉斯估計的例子。它看起來像這樣:
weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C
where:
R = average for the place (mean) = (Rating)
v = number of votes for the place = (votes)
m = minimum number of votes required to be listed in the Top 25 (unsure how many, but somewhere between 2-5 seems realistic)
C = the mean vote across the whole database
的問題開始當我試圖實現這個加權評分在存儲過程 - 它很快變得複雜和我糾纏到的存儲過程做什麼括號和適度寬鬆的軌道。
現在我需要一些幫助的兩個問題:
這是用於計算加權指數爲我的網站的適當方法?
在存儲過程中實現時,此(或其他合適的計算方法)的外觀如何?
這樣做..高興地幫助你。如果你對我的回答沒問題,你可以考慮接受它? – Arion 2012-04-02 10:33:38
而且如果你看到我的答案,我已經更新了它 – Arion 2012-04-02 10:44:06
我只是想確保CTE幫助我解決原始問題(實現更復雜的分數索引),然後再將答案標記爲解決方案。我正在研究新的存儲過程... – tkahn 2012-04-02 10:47:42