私はMSSQLServer 2008データベースを持っており、そこに食べ物を提供する場所(カフェ、レストラン、ダイナーなど)を保存しています。このデータベースに接続されているWebサイトでは、場所を1から3のスケールで評価できます。
このWebサイトには、特定の都市の上位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
ご覧のとおり、投票スコアだけでなく、場所や場所などのデータが必要です。これは問題なく機能しますが、大きな問題が1つあります。投票数が考慮されていないため、投票スコアが単純すぎることです。簡単な計算方法では、スコア3で1票の場所は、スコア3で14票、スコア2で1票の場所よりもリストの上位になります。
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
問題は、この加重評価をストアドプロシージャに実装しようとすると始まります。これはすぐに複雑になり、括弧に絡まって、ストアドプロシージャの機能を追跡できなくなります。
今私は2つの質問でいくつかの助けが必要です:
これは私のサイトの加重指数を計算するのに適した方法ですか?
ストアドプロシージャに実装すると、これ(または別の適切な計算方法)はどのようになりますか?