Ich habe freundlicherweise diesen Algorithmus bekommen, um mir zu helfen, eine Fixture-Liste in SQL zu erstellen, aber als SQL-Code anzuwenden, ich habe keine Ahnung, wie es geht. Gibt es eine Möglichkeit, wie mir jemand zeigen kann, wie man es mit Code anwendet?
Unten ist mein Tabellenschema und darunter ist der Algorithmus:
Liga:
%Vor%Team:
%Vor%Befestigung:
%Vor%ALGORITHMUS:
Lässt uns den Algorithmus übersetzen, Round-Robin-Scheduling , in Form einer geordneten Liste l
von N Teams (die N-1 Polygonscheitelpunkten + dem Polygonzentrum entsprechen):
l
definiert Fixtures, indem die erste Mannschaft aus der Liste gegen die letzte, die zweite gegen die vorletzte gespielt wird, usw.
Das heißt, für 0 ≤ x < N
spielst du Team l[x]
gegen Team l[N-1-x]
.
Um den nächsten Satz von Fixtures zu generieren, rotieren Sie die N-1
ersten Elemente der Liste.
Das ist l = l[1] + l[2] + ... + l[N-2] + l[0] + l[N-1]
Sobald du den ganzen Satz von N-1
Rotationen gemacht hast, tu es erneut, aber tausche Heim- und Auswärts-Teams aus: spiele team l[N-1-x]
vs team l[x]
anstelle des Gegenteils.
Wenn Sie mit der numerisch geordneten Liste 0..N-1
beginnen, dann ist die Liste bei Runde i
:
l = [(i + 0) % (N-1)] + [(i + 1) % (N-1)] + ... + [(i + N-2) % (N-1)] + [N-1]
Das heißt, Fixtures haben die Runde i
:
i
gegen N-1
0 < x < (N-1) / 2
, (x + i) % (N-1)
gegen (N-1 - x + i) % (N-1)
Jetzt gibt es einen Trick, denn dieser funktioniert nur für gerade Zahlen. Ansonsten spielt die letzte Mannschaft immer (gegen Team i
bei Runde i
), während natürlich jede Runde eine Mannschaft hat kann nicht spielen. Das würde bedeuten, dass Team 4 ein Spiel mehr spielt als die anderen Teams.
Um das Problem zu lösen, fügen wir ein Dummy-Team hinzu , also haben wir für fünf Teams N = 6
und bei Runde i
:
i
vs 5
(das Dummy-Team) (i + 1) % 4
vs (4 + i) % 4
(i + 2) % 4
vs (3 + i) % 4
Nun, da Sie das wissen, können Sie eine Funktion erzeugen, die Ihnen Fixtures basierend auf der Rundenzahl gibt. Es sollte folgendes ausgeben:
Runde 0: 0 ruht, 1 vs 4, 2 vs 3
Runde 1: 1 Pausen, 2 vs 0, 3 vs 4
Runde 2: 2 Pausen, 3 gegen 1, 4 gegen 0
Runde 3: 3 Pausen, 4 vs 2, 0 vs 1
Runde 4: 4 Pausen, 0 gegen 3, 1 gegen 2
Beachten Sie, dass statt i
in den Formeln x + i
und N-1 - x + i
beliebig viele m * i
(also x + m * i
und N-1 - x + m * i
) solange m
und N-1
und N - 1 = 5
Primzahl, Sie können also jedes gewünschte m
verwenden.
UPDATE:
Wie unten beschrieben, sind die Testdaten zuerst für die Ligatabelle und dann für die Team-Tabelle (passend zu den Tabellenschema-Spalten in der Reihenfolge)
Liga:
%Vor%Teams:
%Vor%Teams spielen sich gegenseitig zuhause und auswärts und können nur gegen Teams spielen, die in der gleichen Liga sind (daher die verschiedenen Liga-IDs)
Die Matches sollten für jede Runde so aussehen:
%Vor%Dies sollte alles in der 'Fixture' Tabelle eingefügt werden.
Eine andere Oracle-Lösung.
Einrichtung :
%Vor%Einfügen - Fixtures :
%Vor%Ausgabe :
%Vor% (Hinweis: FixtureDate
ist NULL
, da unklar ist, wie Sie dies erzeugen möchten, aber Sie sollten in der Lage sein, die Wochennummer zu verwenden und diese als Offset vom Beginn der Saison zu verwenden, um Daten zu generieren )
Das Folgende scheint zu bekommen, was Sie wollen - aber das ist Oracle SQL (ich habe im Moment keinen Zugriff auf eine SQL-Server-DB). Aber ich glaube, alles, was Sie ändern müssen, ist die MOD-Funktion, die Textverkettung und der Verweis auf DUAL, damit es auf SQL Server funktioniert:
%Vor%Die erste WITH-Tabelle (TEAMS) dient nur dazu, einige Beispieldaten zu erstellen.
Die zweite Tabelle (TEAMSX) erstellt ein Dummy-Team, wenn wir eine ungerade Anzahl von Teams haben.
Die dritte Tabelle (TEAM_FIX) ist ein rekursiver CTE, der die Funktion verwendet, die Sie zum Generieren der richtigen Listenreihenfolge für jede Runde angegeben haben.
In der Hauptabfrage verbinden wir TEAM_FIX für jede Runde mit sich selbst, um Team-Matchups zu erstellen.
Tags und Links sql sql-server sql-server-2012