私は食べ物を提供する場所(カフェ、レストラン、ダイナーなど)を保管するMS SQL Server 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
場所に投票がない場合は、ゼロで割り切る必要もあります。これはストアドプロシージャ内で実行され、トップリストに表示する他のデータを取得します。私は、場所に関するデータを必要とする、市はそれはに位置しています -
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
あなたはそれだけで投票スコアよりもフェッチ見ることができるように:ここでは、最も高い投票スコアがトップ25の場所を取得し、現在のストアドプロシージャがあります等々。これはうまくいきますが、1つの大きな問題があります。投票数は、投票数を考慮しないため、単純すぎます。修正するには
3/1 = 3
(14*3 + 1*2) = 44/15 = 2.933333333333
:簡単な計算方法ではスコア3で一票を持っている場所はスコア2でスコア3と一票で14票を持っている場所よりも、リストの上位になってしまいますこれは、私はいくつかの形式の加重平均/加重インデックスを使用して調べてきました。私は有望と思われる真のベイジアン推定の例を見つけました。それは次のようになります。私は、ストアドプロシージャでこの加重評価を実施しようとすると、
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つの質問をいくつかの助けを必要とする:
が、これは私のサイトのための加重指数を計算するための適切な方法ですか?
ストアドプロシージャに実装した場合、これ(または別の適切な計算方法)はどのように見えますか?
あなたのお役に立てれば幸いです。あなたは私の答えでうまくいけばそれを受け入れることを検討するかもしれません? – Arion
また、私の答えが表示された場合は – Arion
を更新しました。解決策として回答をマークする前に、CTEが元の問題を解決するのに役立つ(より複雑なスコアインデックスを実装する)ことを確認したいだけです。私は今、新しいストアドプロシージャに取り組んでいます... – tkahn