趋势SQL查询

时间:2012-02-15 03:21:06

标签: php mysql sql algorithm trend

所以我要做的是制作一个趋势算法,我需要帮助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代码,但我很不能无法让它工作。

1 个答案:

答案 0 :(得分: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代理作业,每隔X分钟运行一次,更新Last7dPlays和Last24hrPlays。

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(来自问题)。这是3的SQL。

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

注意我使T-SQL非常通用且未经优化,以说明该过程的工作原理。