Тенденции SQL-запросов - PullRequest
       8

Тенденции SQL-запросов

1 голос
/ 15 февраля 2012

Итак, я пытаюсь сделать алгоритм трендов, мне нужна помощь с кодом 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 Ответ

1 голос
/ 15 февраля 2012

В ваших? 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 довольно универсальным и неоптимизированным, чтобы проиллюстрировать, как работает этот процесс.

...