Ich möchte einen "logarithmischen", auf Alterung basierenden Score-Decay implementieren, und ich versuche, die SUM / LOG-Kombination herauszufinden. Hier haben Sie eine vereinfachte Version der aktuellen Abfrage:
%Vor%Ich mache gerade SELECT 'SUM (1) als total_score', aber ich möchte die Abfrage modifizieren, um das Datum / Alter der Wahl zu berücksichtigen; wo eine Stimme von heute 1, eine Stimme von vor 15 Tagen eine Gewichtung nahe 0,8 und eine Stimme von vor 30 Tagen nahe 0 hat. Ich speichere das Datumsfeld in der Stimmen-Tabelle (vote_date) als unix_timestamp.
Ich mache mir nicht wirklich Sorgen um die WHERE-Klasse; Das ist ziemlich einfach. Was ich versuche herauszufinden, ist der logarithmische Alterungsteil.
Ich denke, es gibt zwei Teile zu Ihrer Antwort. Zuerst die Gewichtungsfunktion und dann die SQL-Implementierung.
Wegweisende Funktion:
Gemäß Ihrer Grafik möchten Sie nicht, dass ein logarithmisches Gewicht eher parabolisch ist.
Von diesem müssen Sie lösen
Xc = y
wo
%Vor%und
%Vor%Sie erhalten c = X ^ (- 1) y oder in Matlab
%Vor%Jetzt haben Sie die entsprechenden Werte der quadratischen Funktion, die Sie abgebildet haben; nämlich y = ax ^ 2 + bx + c mit (a, b, c) = (-. 0013, .0073, .9941).
SQL-Teil:
Sie sollten auswählen, dass die Anweisung wie folgt aussehen soll (vorausgesetzt, dass die Spalte von Interesse "Alter" genannt wird)
%Vor%Hoffe es hilft
Prost
Hier ist der komplette Matlab Code (auch um die Lösung zu überprüfen)
%Vor%
Angenommen, Sie haben eine Funktion WEIGHT(age)
, die das Gewicht einer Abstimmung angibt, die age
Tage alt ist.
Dann wäre Ihre Abfrage
%Vor% Ich fürchte, ich weiß nicht genau, welche Funktion Sie für WEIGHT(age)
haben wollen. Aber Sie tun, und Sie können es ausarbeiten.
Tags und Links mysql