MySQL Winning Streak für ein Team

8

Ich habe eine SQL-Abfrage, die die folgende Tabelle über ein einzelnes Team zurückgibt:

%Vor%

Könnte mir bitte jemand aus dieser Tabelle helfen, zu berechnen, was die längsten Gewinn- und Verluststreifen sind?

Ich habe mir ein paar andere Beispiele hier angesehen, aber ich habe Schwierigkeiten damit, ihnen zu folgen, da sie nicht ganz so wie meine sind. Jede Hilfe würde sehr geschätzt werden. Danke!

    
Graeme Cowbeller 07.05.2012, 07:30
quelle

6 Antworten

2

Sie müssen einige MySQL-Variablen implementieren, um effizienter damit umgehen zu können als mehrere Abfragen / Joins / Gruppen. Dies hat einen einzigen Durchlauf durch alle Datensätze, dann noch einmal den maximalen Gewinn pro Typ von Gewinn / Verlust (oder Gleichstand). Ich gehe davon aus, dass die Daten, die Sie zur Verfügung gestellt haben, für ein einziges Mal sind, und das Datum ist die offensichtliche Reihenfolge der Spiele ... Punkte Für ist das Team, das Sie interessieren, und Punkte gegen ist wer auch immer der Gegner ist. Mein Name lautet "YourResultSingleTeam".

Die innere Abfrage bestimmt den Status des Spiels als "W" in oder "L" oss. Überprüfen Sie dann, ob dieser Wert mit der vorherigen Instanz für das Team übereinstimmt. Wenn ja, addiere 1 zu dem bestehenden Gewinn / Verlust-Zähler. Ist dies nicht der Fall, setzen Sie den Zähler auf 1 zurück. Speichern Sie dann den Status des aktuellen Spiels für den Vergleich mit dem nächsten Spiel in den Wert "LastStatus".

Danach ist es ein einfaches Spielergebnis, max () gruppiert nach dem Spielergebnis-Status

%Vor%

Wie von Nikola vorgeschlagen, können Sie, wenn Sie "Gleichheits" -Spiele in Erwägung ziehen möchten, die Einstellung anpassen, indem Sie einfach den @CurStatus in die case / when-Bedingung zu

ändern %Vor%     
DRapp 07.05.2012, 12:53
quelle
1

Es gibt eine Lösung, aber ich denke nicht, dass Sie es mögen werden, weil es einen Self-Join erfordert und Ihre Tabelle keine Tabelle, sondern eine Abfrage ist.

Die innere Abfrage transformiert Daten in Bereiche - so dass für jedes Datum in einer Tabelle das erste Datum gefunden wird, das anders ist, oder, im Falle des letzten Spiels, das Datum dieses Spiels. Diese Daten werden nach dem ersten Datum der verschiedenen Streaks aggregiert, um Streifen zu glätten und zu zählen; äußere Abfrage findet dann Extreme nach Ergebnis.

%Vor%

Um die Notwendigkeit zu umgehen, table1 durch - wahrscheinlich - umständliche Abfrage zu ersetzen, könnten Sie die temporäre Tabelle verwenden oder die Daten bereits in einem geeigneten Format in der Hilfstabelle haben. Es gibt einen Live-Test bei Sql fiddle , zusammen mit einer anderen, von Unterabfragen getriebenen Version, die besser funktionieren könnte - du solltest es versuchen sie beide.

    
Nikola Markovinović 07.05.2012 12:12
quelle
1

MySQL hat keine CTE- oder Fensterfunktion (z. B. SUMME OVER, ROW_NUMBER OVER, usw.). Aber es hat einen erlösenden Faktor. Variablen!

Verwenden Sie dies:

%Vor%

Ausgabe:

%Vor%

Live-Test: Ссылка

Hinweis zu meiner Lösung auf sqlfiddle, es hat zwei Abfragen. 1. Simulation oben. 2. Letzte Abfrage unter

    
Michael Buen 07.05.2012 13:54
quelle
0

Sie handeln hier, um Trends von Gewinnen und Verlusten zu verfolgen, die mit einer Schleife irgendeiner Art mit einem laufenden Zähler, nicht in SQL, berechnet werden müssen. SQL-Abfragen befassen sich mit einzelnen Zeilen, Gruppierung, Sortierung usw .; Sie versuchen, eine Sprache zu verwenden, die solche Probleme nicht lösen soll.

    
Reza S 07.05.2012 08:24
quelle
0

Sie müssen einen Cursor erstellen, alle Zeilen lesen, die Daten berechnen ... jedes Mal, wenn Sie die längsten Streifen erhalten möchten ...

Ich schlage einen Workaround vor, der die Dinge vereinfachen wird.     Sie fügen eine Spalte in Ihrer Tabelle "streakFor" hinzu. jedes Mal, wenn Sie eine Zeile einfügen:

%Vor%

last_streakFor ist streakFor in der letzten eingefügten Zeile
dann fügen Sie die Zeile mit der Spalte streakFor

ein

Jetzt können Sie

  • select max(streakFor) from yourTable where yourConditions , die Ihnen sowohl die längste Siegesserie für "pointsFor" als auch die längste Pechsträhne für "pointsAgainst"
  • bietet
  • select min(streakFor) from yourTable where yourConditions gibt dir die längste Gewinnserie für "pointsAgainst" und die längste Pechsträhne für "pointsFor"
jazzytomato 07.05.2012 08:26
quelle
0

Danke für die Hilfe Jungs. Ich benutzte Php, um wie vorgeschlagen durchzulaufen. falls jemand sich fragt, das ist mein Code:

%Vor%     
Graeme Cowbeller 07.05.2012 15:32
quelle

Tags und Links