Ich glaube, diese Abfrage wird das tun, was Sie wollen:
SELECT array_agg(players), player_teams
FROM (
SELECT DISTINCT t1.t1player AS players, t1.player_teams
FROM (
SELECT
p.playerid AS t1id,
concat(p.playerid,':', p.playername, ' ') AS t1player,
array_agg(pl.teamid ORDER BY pl.teamid) AS player_teams
FROM player p
LEFT JOIN plays pl ON p.playerid = pl.playerid
GROUP BY p.playerid, p.playername
) t1
INNER JOIN (
SELECT
p.playerid AS t2id,
array_agg(pl.teamid ORDER BY pl.teamid) AS player_teams
FROM player p
LEFT JOIN plays pl ON p.playerid = pl.playerid
GROUP BY p.playerid, p.playername
) t2 ON t1.player_teams=t2.player_teams AND t1.t1id <> t2.t2id
) innerQuery
GROUP BY player_teams
Result:
PLAYERS PLAYER_TEAMS
2:Allen,3:Pierce 1,3
4:Garnett,5:Perkins
Es verwendet array_agg über der Team-ID für jeden Spieler in plays
um Spieler mit genau der gleichen Teamkonfiguration zusammenzubringen. Ich habe zum Beispiel eine Spalte mit den Teams eingefügt, aber das kann entfernt werden, ohne die Ergebnisse zu beeinflussen, solange es nicht aus der Gruppieren-nach-Klausel entfernt wird.
SQL-Fiddle-Beispiel. Getestet mit Postgesql 9.2.4
BEARBEITEN:Fehler behoben, der Zeilen duplizierte.