2016-05-20 46 views
0

我希望能够计算出我的每名球员对一名敌方球员的胜率(并返回胜率百分比)。所以说敌方球员是'104'。我想找出我的球员'23'与'104','48'与'104'等的胜率以及他们总共打了多少场比赛(以赢得胜率) 我一直在尝试弄清楚如何在PostgreSQL的查询执行以下操作:sql - 获得球队对所有其他球队的胜利率

输入:myTeamID = 26691960, enemyPlayerID = 104

表:

Matchups 
winner_team_id | winner_player_id | loser_team_id | loser_player_id 
----------------+------------------+---------------+----------------- 
    26691960 | 24    |  45631137 | 104 
    26691960 | 23    |  45334612 | 104 
    26691960 | 48    |  22191174 | 104 
    26691960 | 23    |  31191882 | 104 
    26691960 | 14    |  20731636 | 104 
    26691960 | 14    |  23648001 | 104 
    26691960 | 14    |  35009401 | 104 
    26691960 | 23    |  28954626 | 104 
    28809466 | 104    |  26691960 | 23 
    70012915 | 104    |  26691960 | 24 
    ... 

(此表只显示游戏中敌人的玩家ID是104和所有的队员id = 26691960)

输出:

player_id | win_rate | games_played 
---------------------------------- 
23   75%  4 
14   100%  3 
48   100%  1 
24   50%  4 

回答

1

几个简单的聚合函数与FULL JOIN配对应该可以做到。请注意,COALESCE可能存在性能问题。你可以将COALESCE(win_count, 0) + COALESCE(loss_count, 0)包装在子查询中,得到games_played,然后在win_rate方程中使用它。

无论如何,事不宜迟:

SELECT COALESCE(wins.loser_player_id, losses.winner_player_id) as player_id, 
(COALESCE(loss_count, 0)/(COALESCE(win_count, 0) + COALESCE(loss_count, 0)))::numeric(3, 2) as win_rate, 
(COALESCE(win_count, 0) + COALESCE(loss_count, 0))::bigint as games_played 

FROM (
    SELECT winner_player_id, loser_player_id, count(*) * 1::numeric(3,2) as win_count --this is a hack to get a decimal 
    FROM a.scores win 
    WHERE winner_player_id = 104 
    GROUP BY winner_player_id, loser_player_id 
) 
as wins 

FULL JOIN 
(
    SELECT winner_player_id, loser_player_id, count(*) * 1::numeric(3,2) as loss_count 
    FROM a.scores win 
    WHERE loser_player_id = 104 
    GROUP BY winner_player_id, loser_player_id 
) as losses ON row(wins.winner_player_id, wins.loser_player_id) = row(losses.loser_player_id, losses.winner_player_id) 
+0

非常感谢你!我不认为采取你的方法将它分成两个查询! – Jerry