8

老化に基づいて「対数」スコア減衰を実装したいのですが、SUM/LOG の組み合わせを見つけようとしています。ここに、現在のクエリの単純化されたバージョンがあります。

SELECT SUM(1) as total_score FROM posts
JOIN votes ON votes.post_id = posts.post_id
WHERE 1
GROUP BY post_id
ORDER BY total_score DESC

現在、SELECT 'SUM(1) as total_score' を実行していますが、投票の日付/年齢を考慮してクエリを変更したいと考えています。ここで、今日の投票の重みは 1、15 日前の投票の重みは 0.8 に近く、30 日前の投票の重みは 0 に近くなります。日付フィールドを投票テーブル (vote_date) に unix_timestamp として保存しています。

ここに画像の説明を入力

私は WHERE 句についてあまり気にしていません。それはとても簡単です。私が理解しようとしているのは、対数老化部分です。

4

3 に答える 3

3

あなたの答えには2つの部分があると思います。最初に加重関数、次に SQL の実装です。

重み付け機能:

グラフによると、放物線状の対数重量は必要ありません。

これから、あなたは解決しなければなりません

Xc = y

どこ

X = [1 1 1 ;
    15^2 15 1;
    30^2 30 1];

y = [1;.8;0];

c = X^(-1)y または matlab で取得します

c = X\y

これで、描いた二次関数の適切な重みが得られました。つまり、y = ax^2+bx+c (a,b,c) =(-.0013,.0073,.9941) です。

SQL 部分:

selectステートメントは次のようになります(対象の列の名前が「age」であると仮定します)

SELECT (-.0013*age*age + .0073*age + .9941) as age_weighted

それが役に立てば幸い

乾杯


完全なMatlabコードは次のとおりです(ソリューションを再確認するため)

X = [1 1 1 ;
    15^2 15 1;
    30^2 30 1];

y = [1;.8;0];

c = X\y;

x= (1:30)';
y = [x.^2 x ones(30,1)]*c;

figure(1)
clf;hold on
plot(x,y)
plot([1 15 30],[1 .8 0],'o')

Matlab の出力

于 2012-11-07T14:51:42.710 に答える
0

私はSQLの部分を行っていませんが、少なくとも数学的には、後の減衰を提供する関数を見つけました

y=(sqrt(900-(x^2)))/30

またはあなたの場合

score=(sqrt(900-(days^2)))/30

ここに画像の説明を入力

それが役立つことを願っています!

于 2012-10-12T00:42:07.250 に答える
0

WEIGHT(age)数日前の投票の重みを与える関数があるとしますage

次に、クエリは次のようになります

    SELECT SUM(WEIGHT(DATEDIFF(CURRENT_DATE, votes.date_vote_cast))) as total_score,
           posts.post_id
      FROM posts
      JOIN votes ON votes.post_id = posts.post_id
     WHERE votes.date_vote_cast <= CURRENT_DATE
       AND votes.date_vote_cast > CURRENT_DATE - INTERVAL 30 DAY
  GROUP BY post_id
  ORDER BY total_score DESC 

残念ながら、あなたがどの機能を必要としているのか正確にはわかりませんWEIGHT(age)。しかし、あなたはそうします、そしてあなたはそれを解決することができます.

于 2012-10-12T00:31:33.143 に答える