私の現在のアプリケーションは、各ユーザーのすべてのレコードに基づいてポイント平均を計算します。
SELECT `user_id`, AVG(`points`) AS pts
FROM `players`
WHERE `points` != 0
GROUP BY `user_id`
ビジネス要件が変更されたため、各ユーザーの最新の 30 件のレコードに基づいて平均を計算する必要があります。
関連するテーブルの構造は次のとおりです。
テーブル: プレイヤー; 列: player_id、user_id、match_id、ポイント
テーブル: ユーザー; 列: user_id
次のクエリは機能しませんが、実装しようとしているロジックを示しています。
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
各ユーザーの最新の 30 件のレコードに基づいて平均を計算するかなり効率的な方法はありますか?