Вярвам, че тази заявка ще направи това, което искате:
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
Той използва array_agg над teamid за всеки играч в plays
за да съчетаете играчи с точно същата конфигурация на отбора. Включих например колона с отборите, но тя може да бъде премахната, без това да повлияе на резултатите, стига да не бъде премахната от клаузата за групата.
Пример за SQL Fiddle. Тествано с Postgesql 9.2.4
РЕДАКТИРАНЕ:Поправена е грешка, която дублира редове.