我有一个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