在PostgreSQL中找出由Y组成的每个X的比例?

时间:2017-03-17 20:40:28

标签: postgresql

我有一个庞大的魔术数据库:聚会卡和名单。卡表包含每张卡的类型和转换后的法术力费用(以及其他内容)。甲板使用两个表存储:甲板本身称为"甲板"和一个名为" deckmembers"的表,其中每行包含甲板的ID,ID该套牌中包含的卡片,以及该卡片中出现的该卡片的份数。

我想要的是这些数据的视图,其中行是:

deck:甲板的ID

cmc:该牌组中至少一张牌上出现的总法术力费用

比例:该牌组中具有该cmc

的非国家牌的百分比

或者我最好用Python或R或其他东西来获取这些数据?

This question is conceptually similar, but no one has answered it.

编辑:

因为你问过,这里有一些示例数据:

卡:

 id |        name         |    fulltype     | cmc
----+---------------------+-----------------+-----
  1 | "Ach! Hans, Run!"   | Enchantment     |   6
  2 | 1996 World Champion | Summon _ Legend |   5
  4 | AWOL                | Instant         |   3
  5 | Abandon Hope        | Sorcery         |   2
  6 | Abandon Reason      | Instant         |   3

甲板:

 id |      name
----+-----------------
  1 | RDW
  2 | Red Deck Recall
  3 | RDW
  4 | Red Deck Wins
  5 | Red Deck Wins

deckmembers:

 deck | card  | count
------+-------+-------
    1 | 14031 |     1
    1 | 15011 |     1
    1 | 14263 |     1
    1 | 12966 |     1
    1 | 12536 |     1

任何牌组都会有很多牌。任何卡片都可能出现在许多套牌中。每张牌都有一个0-12的整数关联它,这被称为"转换后的法力消耗"或CMC。这就是你需要知道的全部内容。不要在我的帐户上学习玩Magic。

我想要的东西可能看起来像:

 deck | cmc | perc
------+-------+-------
    1 | 1   |  11
    1 | 2   |  11
    1 | 3   |  11
    1 | 4   |  11
    1 | 5   |  11

在哪里" perc"在第一行中,表示ID为1的卡片中有11%的卡片具有cmc 1。

1 个答案:

答案 0 :(得分:0)

解决了!

SELECT
    d.id,
    c.cmc,
    (CAST(SUM(m.count) AS FLOAT) / 
        (SELECT
            CAST(SUM(m1.count) AS FLOAT)
        FROM deckmembers AS m1
        JOIN cards AS c1 ON c1.id=m1.card
        WHERE NOT m1.sideboard
        AND c1.fulltype NOT LIKE '%Land%'
        AND m1.deck=d.id)
    ) * 100 AS perc
FROM deckmembers AS m
JOIN decks AS d ON d.id=m.deck
JOIN cards AS c ON c.id=m.card
WHERE NOT m.sideboard
AND c.fulltype NOT LIKE '%Land%'
GROUP BY d.id, c.cmc;

我还发布了问题here更简单版本的解决方案。