Durchschnitt der letzten N Datensätze pro Gruppe

Meine aktuelle Anwendung berechnet einen Punktedurchschnitt basierend auf allen Datensätzen für jeden Benutzer:

SELECT `user_id`, AVG(`points`) AS pts 
FROM `players` 
WHERE `points` != 0 
GROUP BY `user_id`

Die Geschäftsanforderungen haben sich geändert, und ich muss den Durchschnitt basierend auf den letzten 30 Datensätzen für jeden Benutzer berechnen.

Die relevanten Tabellen haben folgenden Aufbau:

Tisch: Spieler; Spalten: player_id, user_id, match_id, points

Tabelle: Benutzer; Spalten: user_id

Die folgende Abfrage funktioniert nicht, zeigt jedoch die Logik, die ich implementieren möchte.

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

Gibt es eine ziemlich effiziente Möglichkeit, die Durchschnittswerte basierend auf den letzten 30 Datensätzen für jeden Benutzer zu berechnen?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage