Ich habe eine MS SQL Server 2008 Datenbank, wo ich Orte, die Essen (Cafés, Restaurants, Restaurants etc.) servieren. Auf einer Website, die mit dieser Datenbank verbunden ist, können Personen die Orte auf einer Skala von 1 bis 3 bewerten.Berechnen Sie eine gewichtete (Bayesian) durchschnittliche Punktzahl/Index in der gespeicherten Prozedur?
Auf der Website gibt es eine Seite, wo die Leute eine Top-Liste mit den besten 25 (am besten bewerteten) Orten in einem anzeigen können bestimmte Stadt. Die Datenbankstruktur sieht ungefähr so aus (es sind mehr Informationen in den Tabellen gespeichert, aber hier sind die relevanten Informationen):
Ein Ort befindet sich in einer Stadt und Stimmen werden auf einen Platz platziert.
Bis jetzt habe ich nur eine durchschnittliche Stimme Punktzahl für jeden Ort berechnet, wo ich die Summe aller Stimmen für einen bestimmten Ort mit der Zahl der Stimmen für diesen Ort, so etwas wie dieses (Pseudo-Code) unterteilen:
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
Ich muss auch Division durch Null behandeln, wenn ein Ort keine Stimmen hat. All dies geschieht innerhalb der gespeicherten Prozedur, die die anderen Daten abruft, die ich in der obersten Liste anzeigen möchte. Hier ist die aktuelle gespeicherte Prozedur, die die Top-25-Plätze mit der höchsten Stimme Punktzahl holt:
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
Wie Sie sehen können es mehr holt als nur die Stimme Partitur - Ich muss die Daten über den Ort, die Stadt es gelegen ist in und so weiter. Das funktioniert gut, aber es gibt ein großes Problem: Die Stimmenzahl ist zu einfach, weil sie die Anzahl der Stimmen nicht berücksichtigt. Mit der einfachen Berechnungsmethode eines Ort, der eine Stimme mit der Partitur hat 3 wird am Ende in der Liste höher als ein Ort, der vierzehn Stimmen mit der Partitur hat 3 und eine Stimme mit dem Ergebnis 2:
3/1 = 3
(14*3 + 1*2) = 44/15 = 2.933333333333
zu beheben Dies habe ich untersucht, indem ich irgendeine Form von gewichtetem Durchschnitt/gewichtetem Index verwendet habe. Ich habe ein Beispiel für eine wahre bayesische Schätzung gefunden, die vielversprechend aussieht. Es sieht wie folgt aus:
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
Die Probleme beginnen, wenn ich versuche, diese gewichtete Bewertung in einer gespeicherten Prozedur zu implementieren - es wird schnell kompliziert und ich verheddern in Klammern und den Überblick verlieren, was die gespeicherte Prozedur tut.
Jetzt brauche ich etwas Hilfe mit zwei Fragen:
Ist das ein geeignetes Verfahren für einen gewichteten Index für meine Seite Berechnung?
Wie sieht dieses (oder eine andere geeignete Berechnungsmethode) aus, wenn es in einer gespeicherten Prozedur implementiert wird?
Tun Sie das .. Glücklich, Ihnen zu helfen. Wenn es Ihnen mit meiner Antwort gut geht, könnten Sie diese akzeptieren? – Arion
Und auch wenn Sie meine Antwort sehen Ich habe es aktualisiert – Arion
Ich möchte nur sicherstellen, dass CTE hilft mir, das ursprüngliche Problem zu lösen (Implementierung eines komplexeren Score-Index), bevor ich Ihre Antwort als Lösung markieren. Ich arbeite jetzt an der neuen gespeicherten Prozedur ... – tkahn