2012-02-15 175 views
1

所以我想做的是做一個趨勢算法,我需要幫助與SQL代碼,因爲我不能得到它去。趨勢SQL查詢

有三個方面的算法:(我要想法完全開放的上一個更好的趨勢算法)

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的最大值成爲可能。

第三個方面是必要的,因爲新上傳的項目將自動處於最佳位置,除非它們是一種方法來刪除它們。

的表稱爲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代碼,但即時通訊相當卡暫時無法得到這個工作。

+5

對不起,但你可以進入更多的細節?我聽到的只有算法,.33和SQL。 – 2012-02-15 03:31:14

+0

當然,我想要一個SQL查詢來確定哪首歌曲正在趨勢與其他歌曲。我想到的是每個價值最高0.33的三個價值。這三個值的總和將被命令確定最高的趨勢歌曲。目前,我希望查詢的三個0.33值由歌曲的24h播放次數/總播放次數,歌曲的7天播放次數/總播放次數,以及具有最多播放次數的歌曲的24h播放次數/ 24h播放次數來確定24h – JimmyBanks 2012-02-15 03:38:28

+0

您可以發佈您嘗試過的SQL代碼嗎? – rdlowrey 2012-02-15 04:13:51

回答

1

在你的?aud_songs? (一的AID點)表中添加以下幾列

  • Last24hrPlays INT - 使用BIGINT如果你打算讓十億+
  • Last7dPlays INT
  • TotalPlays INT

在你的aud_plays表創建了一個AFTER INSERT觸發器,它將增加aud_song.TotalPlays。

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

實時計算的趨勢爲每個請求將您的服務器上徵稅,所以最好只運行一個任務來更新數據每隔5分鐘左右。因此,創建一個SQL代理作業來運行每更新Last7dPlays和Last24hrPlays的X分鐘。

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(去除舊的記錄可能比7天舊的,因爲你將有TotalPlays觸發。

應該很容易弄清楚如何計算1和2(從這個問題)。下面是SQL的3

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

注意我所做的T-SQL相當通用的和未優化來說明這個過程是如何工作的。