【问题标题】:sql - get team's win rate against all other teamssql - 获取球队对所有其他球队的胜率
【发布时间】:2016-09-18 06:54:46
【问题描述】:

我希望能够计算我的每个玩家对抗单个敌方玩家的胜率(并返回胜率)。所以说敌方玩家是'104'。我想知道我的玩家“23”对“104”、“48”对“104”等的胜率以及他们总共玩了多少场比赛(以计算胜率) 我一直在试图弄清楚如何在 PostgreSQL 中进行查询以执行以下操作:

输入: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

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    一些简单的聚合函数与FULL JOIN 配对应该可以解决问题。请注意,COALESCEs 可能存在性能问题。您可以将 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)
    

    【讨论】:

    • 非常感谢!我没想到会采用您的方法将其拆分为两个查询!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2012-12-11
    相关资源
    最近更新 更多