Durchschnitt der letzten N Datensätze pro Gruppe

8

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

%Vor%

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

Die relevanten Tabellen haben folgende Struktur:

Tabelle: Spieler; Spalten: player_id, user_id, match_id, Punkte

Tabelle: Benutzer; Spalten: user_id

Die folgende Abfrage funktioniert nicht, aber sie demonstriert die Logik, die ich implementieren möchte.

%Vor%

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

    
JV- 05.06.2013, 18:00
quelle

5 Antworten

6

Versuchen Sie Folgendes:

%Vor%     
Saharsh Shah 08.06.2013, 13:50
quelle
8

Es gibt keinen Grund, ein Rad neu zu erfinden und Sie riskieren einen fehlerhaften, suboptimalen Code. Ihr Problem ist eine triviale Erweiterung des üblichen Problems mit der Gruppenbeschränkung . Es gibt bereits getestet und optimierte Lösungen, um dieses Problem zu lösen , und von dieser Ressource würde ich empfehlen, aus folgenden zwei Lösungen zu wählen. Diese Abfragen erzeugen die letzten 30 Datensätze für jeden Spieler (für Ihre Tabellen neu geschrieben):

%Vor%

(Nur um sicherzustellen, dass ich Ihre Struktur verstehe: Ich nehme an, dass player_id ein eindeutiger Schlüssel in der Spielertabelle ist und dass ein Benutzer in dieser Tabelle als mehrere Spieler vorhanden sein kann.)

Zweite getestet und optimierte Lösung verwendet MySQL-Variablen:

%Vor%

Die erste Abfrage ist nicht so optimal (ist quadratisch), während die zweite Abfrage optimal ist (one-pass), aber nur in MySQL funktioniert. Die Wahl liegt bei Ihnen. Wenn Sie sich für die zweite Technik entscheiden, passen Sie auf und testen Sie sie richtig mit Ihren Schlüsseln und Datenbankeinstellungen; schlagen sie unter bestimmten Umständen vor es könnte aufhören zu arbeiten .

Ihre letzte Abfrage ist trivial:

%Vor%

Beachten Sie, dass ich die Bedingung, die Sie in Ihrer ersten Abfrage (points != 0) haben, nicht übernommen habe, da ich Ihre Anforderung nicht gut verstehe (Sie haben sie nicht beschrieben), und ich denke auch, dass diese Antwort allgemein genug sein sollte, um zu helfen andere mit ähnlichem Problem.

    
TMS 08.06.2013 17:12
quelle
0

Das sollte funktionieren:

%Vor%

Der Teil nach UNION ALL ist nur erforderlich, wenn Sie Benutzer mit weniger als 30 Datensätzen einschließen müssen.

    
rsanchez 07.06.2013 23:06
quelle
0

Wenn ich Ihre Logik richtig verstehe, müssen Sie den Score-Durchschnitt für jeden Benutzer basierend auf den letzten 30 Datensätzen (geordnet nach match_id) berechnen, die keine Nullpunkte haben.

Zuerst müssen Sie die letzten 30 Datensätze für jeden Benutzer zurückgeben, und Sie könnten eine Abfrage wie diese verwenden:

%Vor%

Dann müssen Sie den Durchschnitt der vorherigen Abfrage berechnen:

%Vor%     
fthiella 08.06.2013 08:17
quelle
0
%Vor%

und versuche das auch ...

    
VR4Creativity 08.06.2013 06:45
quelle