In dieser Frage muss ich ein Spielerpaar mit seiner playerID und playerName auflisten, die für die gleichen Teams spielen. Wenn ein Spieler für 3 Mannschaften spielt, muss der andere für genau 3 gleiche Mannschaften spielen. Nicht weniger, nicht mehr. Wenn zwei Spieler derzeit nicht für ein Team spielen, sollten sie ebenfalls berücksichtigt werden. Die Abfrage sollte zurückgeben (playerID1, playername1, playerID2, playerName2) ohne Wiederholung, wie wenn Player 1 Info vor Player 2 kommt, es sollte kein weiteres Tupel mit Player 2 Informationen vor Player 1 geben.
Wenn zum Beispiel Spieler A für Yankees und Redsox spielt und Spieler B für Yankees, Red Sox und Dodgers spielt, sollte ich sie nicht bekommen. Sie müssen beide für Yankees und Red Sox spielen und sonst niemand. Im Moment findet diese Abfrage eine Antwort, wenn Spieler für dasselbe Team spielen.
%Vor%Also sollte ich das als Antwort bekommen -
%Vor%.
2, Allen, 3 Pierce ist ein Snwer, weil beide exklusiv für CELTICS und PATRIOTS spielen 4, Garnett, 5, Perkins ist eine Antwort, weil beide Spieler für keine Teams spielen, die in der Ausgabe sein sollten.
Im Moment ist die Abfrage, die ich habe,
%Vor%Ich bin mir nicht 100% ig sicher, aber ich denke, dass dies Spieler findet, die für dasselbe Team spielen, aber ich möchte Spieler finden, die für die ausschließlich gleichen TEAMS wie oben erklärt spielen
Ich stehe fest darauf, wie ich danach vorgehen soll. Hinweise, wie Sie dieses Problem angehen können. Vielen Dank für Ihre Zeit.
Ich glaube, diese Abfrage wird tun, was Sie wollen:
%Vor%
Er verwendet array_agg über die Teamid für jeden Spieler in plays
, um Spieler mit genau der gleichen Teamkonfiguration zu erreichen. Ich habe beispielsweise eine Spalte mit den Teams eingeschlossen, die aber entfernt werden kann, ohne die Ergebnisse zu beeinflussen, solange sie nicht aus der group by-Klausel entfernt wird.
SQL Fiddle-Beispiel. Getestet mit Postgesql 9.2.4
BEARBEITEN: Ein Fehler, der Zeilen dupliziert, wurde behoben.
Zwei mögliche Lösungen kommen mir in den Sinn:
Können Sie einige Beispieldaten bereitstellen, damit ich ein Beispiel erstellen kann?
Es scheint, als wäre der grundlegende Datentyp, den Sie wollen, Sets und nicht Arrays. Eine Option könnte also die Verwendung von PL / Python mit einem ähnlichen Code sein (siehe unten in dieser Antwort für eine Funktion, die zu diesem Zweck angepasst werden könnte). Natürlich ist dies kein "reiner SQL" Ansatz.
Aber bei PostgreSQL (wenn auch nicht standard SQL), möchten Sie vielleicht auch DISTINCT mit array_agg verwenden. Beachten Sie, dass das folgende nur das erste Paar gibt, das die Kriterien erfüllt (im Prinzip könnte es viel mehr geben).
%Vor%Die obige Abfrage liefert die folgende Ausgabe:
%Vor%Beispiel PL / Python-Funktionen:
%Vor%Version des obigen Codes, der diese Funktionen verwendet (die Ausgabe ist ähnlich, aber dieser Ansatz wählt alle Paare aus, wenn es mehr als eins für eine bestimmte Gruppe von Teams gibt):
%Vor%Wir machen eine Abfrage mit der Anzahl der Teams pro Spieler und der Summe von ascii (team_name) + team_id nennen es team_value. Wir machen einen self join, der die selbe Abfrage mit sich selbst durchführt, wo counts und team_values übereinstimmen aber id nicht gleich id sind, das gibt uns die ID's, die wir holen wollen
%Vor%Hier ist die einfache Abfrage mit UNION und 2-3 einfachen Joins. Die erste Abfrage vor UNION enthält den Spielernamen und die Spieler-ID, die für die gleiche Anzahl von Teams die gleiche Anzahl von Malen gespielt hat. Die zweite Abfrage nach UNION enthält den Spielernamen und die Spieler-ID, die für kein Team gespielt hat.
Kopieren Sie einfach diese Abfrage und versuchen Sie es auszuführen, Sie werden die erwarteten Ergebnisse sehen.
%Vor%Für jeden Interessierten funktioniert diese einfache Abfrage für mich
%Vor%Dies ist ANSI SQL, ohne spezielle Funktionen zu verwenden.
%Vor%Wenn Ihre teamId eindeutig ist, funktioniert diese Abfrage. Es identifiziert einfach alle Spieler, die die gleichen Teams haben, indem sie die Teamid summieren oder wenn der Spieler keine IDs hat, wird es null sein. Zählt dann die Anzahl der Spiele über Team Matches. Ich habe mit SQL Fiddle in Postgre 9.3 getestet.
%Vor%Tags und Links sql postgresql