1

だから私がやろうとしているのは、流行のアルゴリズムを作ることです.SQLコードを手に入れることができないので、助けが必要です.

アルゴリズムには 3 つの側面があります: (私はより良いトレンド アルゴリズムに関するアイデアを完全に受け入れています)

1.Plays during 24h / Total plays of the song
2.Plays during 7d / Total plays of the song 
3.Plays during 24h / The value of plays of the most played item over 24h (whatever item leads the play count over 24h)

各側面は 0.33 の価値があり、最大値 1.0 が可能です。

新しくアップロードされたアイテムは、ドロップダウンする方法でない限り、自動的に一番上に表示されるため、3 番目の側面が必要です。

テーブルは aud_plays と呼ばれ、列は次のとおりです。

PlayID: Just an auto-incrementing ID for the table
AID: The id of the song
IP: ip address of the user listening
time: UNIX time code

私はいくつかのSQLコードを試しましたが、これを機能させることができずにかなり立ち往生しています。

4

1 に答える 1

1

あなたの?aud_songs? (AID が指すもの) テーブルに次の列を追加します

  • Last24hrPlays INT -- 10 億以上の取得を計画している場合は、BIGINT を使用します
  • Last7dPlays INT
  • TotalPlays INT

aud_plays テーブルで、aud_song.TotalPlays をインクリメントする AFTER INSERT トリガーを作成します。

UPDATE aud_song SET TotalPlays = TotalPlays + 1 WHERE id = INSERTED.aid

リクエストごとにトレンドをリアルタイムで計算すると、サーバーに負担がかかるため、ジョブを実行して 5 分ごとにデータを更新することをお勧めします。したがって、Last7dPlays と Last24hrPlays を更新する X 分ごとに実行する SQL エージェント ジョブを作成します。

UPDATE aud_songs SET Last7dPlays = (SELECT COUNT(*) FROM aud_plays WHERE aud_plays.aid = aud_songs.id AND aud_plays.time BETWEEN GetDate()-7 AND GetDate()), 
    Last24hrPlays = (SELECT COUNT(*) FROM aud_plays WHERE aud_plays.aid = aud_songs.id AND aud_plays.time BETWEEN GetDate()-1 AND GetDate())

また、aud_plays から古いレコードを削除することをお勧めします(TotalPlays トリガーがあるため、7 日より古い可能性があります。

あなたの1と2を計算する方法を理解するのは簡単なはずです(質問から)。これが 3 の SQL です。

SELECT cast(Last24hrPlays as float) / (SELECT MAX(Last24hrPlays) FROM aud_songs) FROM aud_songs WHERE aud_songs.id = @ID

: プロセスがどのように機能するかを説明するために、T-SQL を非常に一般的で最適化されていないものにしました。

于 2012-02-15T14:14:18.437 に答える