【问题标题】:SQL Aggregate Column Ratio Across TablesSQL 跨表聚合列比率
【发布时间】:2022-01-25 15:59:37
【问题描述】:

我正在为我正在制作的一款游戏制作一组排行榜,并希望能够在其中拥有一个“K/D”(杀戮-死亡比率)排行榜。即选择(总击杀数)/(总击杀数)比率最高的玩家。

我的数据库目前被格式化为有两个表,一个 Kill 表和一个 Death 表(我知道在这个例子中,将它们作为两个单独的表看起来很愚蠢,但是还有其他与问题无关的细节手头,所以这些需要单独的表)

杀表:

id player_id weapon_type kill_count
1 1 Pistol 5
2 1 Rifle 10
3 2 Rifle 20
4 2 Pistol 7

死亡表:

id player_id weapon_type death_count
1 1 Pistol 2
2 1 Rifle 20
3 2 Rifle 10
4 2 Pistol 3

(请参阅https://i.imgur.com/V8OEVxo.png 了解表格应该是什么样子,因为上面的格式搞砸了。)

根据上述数据,查询最高 K/D 比率将返回 (2,27/13), (1, 15/22);即所有 (player_id, K/D ratio) 对按 K/D 比降序排列。

我已经为最高总击杀数等设置了其他排行榜,我实施如下:

SELECT player_id, sum(kill_count) as totalkills from Kill group by player_id order by totalkills desc;

这似乎工作正常,所以我认为我可以使用以下方法获得最高的 K/D 比率:

SELECT Kill.player_id, sum(kill_count)/sum(death_count) as KD from Kill, Death group by Kill.player_id order by KD desc;

但它给出了完全虚假的结果。

任何关于格式化我的查询的正确方法的指针将不胜感激:)

编辑:我不确定为什么表格在问题中的格式不正确,因为它们在预览中看起来不错。这是一个错误吗?

【问题讨论】:

  • Mysql/postgresql??你用的是哪个数据库??她们不一样。请正确标记您的问题
  • 抱歉@nacho,我正在使用 postgresql 并更新了标签以反映这一点。

标签: sql postgresql


【解决方案1】:

您好,我不明白您的问题。 我认为更好的方法是使用 Window Funktion。

Select player_id, Weapon_type, count() over (partition by player_id) as „killes pro player“ count() over (Partition by player_id, Weapon_type) „kills by player and weapon” from order通过 player_id;

【讨论】:

    【解决方案2】:

    您可以按玩家将击杀数和死亡数组合在一起,然后将它们组合起来以找到您要查找的内容:

    WITH total_kills AS (
        SELECT player_id, sum(kill_count) as kill_count 
        FROM kill 
        GROUP BY player_id
    ), 
    total_deaths AS (
        SELECT player_id, sum(death_count) as death_count 
        FROM death
        GROUP BY player_id
    ) 
    SELECT total_kills.player_id, 1.0 * kill_count / NULLIF(death_count, 0) as kd
    FROM total_kills, total_deaths 
    WHERE total_kills.player_id = total_deaths.player_id
    ORDER BY 2 DESC;
    

    或者如果您更喜欢子查询:

    SELECT total_kills.player_id, 1.0 * kill_count / NULLIF(death_count, 0) as kd
    FROM 
        (SELECT player_id, sum(kill_count) as kill_count 
         FROM kill 
         GROUP BY player_id) as total_kills, 
        (SELECT player_id, sum(death_count) as death_count
         FROM death 
         GROUP BY player_id) as total_deaths 
    WHERE total_kills.player_id = total_deaths.player_id
    ORDER BY 2 DESC;
    

    NULLIF 只是为了防止在玩家没有死亡时查询中断。

    【讨论】:

    • 这正是我想要的,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多