2012-02-15 136 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相当通用的和未优化来说明这个过程是如何工作的。