Wierzę, że to zapytanie zrobi to, czego chcesz:
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
Używa array_agg nad teamid dla każdego gracza w plays
aby dopasować graczy z dokładnie taką samą konfiguracją drużyny. Na przykład dołączyłem kolumnę z zespołami, ale można ją usunąć bez wpływu na wyniki, o ile nie zostanie ona usunięta z klauzuli group by.
Przykład SQL Fiddle. Testowane z Postgesql 9.2.4
EDYCJA:Naprawiono błąd, który powodował powielanie wierszy.