В ваших? 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. (из вопроса). Вот SQL для 3.
SELECT cast(Last24hrPlays as float) / (SELECT MAX(Last24hrPlays) FROM aud_songs) FROM aud_songs WHERE aud_songs.id = @ID
ПРИМЕЧАНИЕ Я сделал T-SQL довольно универсальным и неоптимизированным, чтобы проиллюстрировать, как работает этот процесс.