Średnia ostatnich N rekordów na grupę
Moja aktualna aplikacja oblicza średnią punktową na podstawie wszystkich rekordów dla każdego użytkownika:
SELECT `user_id`, AVG(`points`) AS pts
FROM `players`
WHERE `points` != 0
GROUP BY `user_id`
Wymagania biznesowe uległy zmianie i muszę obliczyć średnią na podstawie ostatnich 30 rekordów dla każdego użytkownika.
Odpowiednie tabele mają następującą strukturę:
table: gracze; kolumny: id_użytkownika, id_użytkownika, id_do dopasowania, punkty
tabela: użytkownicy; kolumny: id_użytkownika
Następujące zapytanie nie działa, ale demonstruje logikę, którą próbuję zaimplementować.
SELECT @user_id := u.`id`, (
-- Calculate the average for last 30 records
SELECT AVG(plr.`points`)
FROM (
-- Select the last 30 records for evaluation
SELECT p.`points`
FROM `players` AS p
WHERE p.`user_id`=@user_id
ORDER BY `match_id` DESC
LIMIT 30
) AS plr
) AS avg_points
FROM `users` AS u
Czy istnieje dość skuteczny sposób obliczania średnich na podstawie ostatnich 30 rekordów dla każdego użytkownika?