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

在PostgreSQL中找到由Y组成的每个X的比例?,postgresql,Postgresql,我有一个很大的魔法数据库:收集卡片和装饰清单。卡牌表包含每张卡牌的类型和转换法力消耗(以及其他)。牌组使用两个表存储:一个牌组本身的表称为“牌组”,另一个表称为“牌组成员”,其中每行包含牌组的ID、该牌组中包含的牌的ID以及牌组中出现的该牌的副本数 我想要的是该数据的视图,其中的行是: 甲板:甲板的ID cmc:该牌组中至少一张牌上显示的转换法力消耗 比例:该牌组中具有该cmc的非地卡的百分比 还是我最好用Python或R之类的语言导出这些数据 编辑: 既然你问了,下面是一些示例数据: 卡片:

我有一个很大的魔法数据库:收集卡片和装饰清单。卡牌表包含每张卡牌的类型和转换法力消耗(以及其他)。牌组使用两个表存储:一个牌组本身的表称为“牌组”,另一个表称为“牌组成员”,其中每行包含牌组的ID、该牌组中包含的牌的ID以及牌组中出现的该牌的副本数

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

甲板:甲板的ID

cmc:该牌组中至少一张牌上显示的转换法力消耗

比例:该牌组中具有该cmc的非地卡的百分比

还是我最好用Python或R之类的语言导出这些数据

编辑:

既然你问了,下面是一些示例数据:

卡片:

 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
甲板成员:

 deck | card  | count
------+-------+-------
    1 | 14031 |     1
    1 | 15011 |     1
    1 | 14263 |     1
    1 | 12966 |     1
    1 | 12536 |     1
任何牌组都有许多牌。任何牌都可能出现在许多牌组中。每张牌都有一个0-12之间的整数与其关联,称为“转换法力消耗”或CMC。你只需要知道这些。别为我费心学魔术了

我想要的可能是:

 deck | cmc | perc
------+-------+-------
    1 | 1   |  11
    1 | 2   |  11
    1 | 3   |  11
    1 | 4   |  11
    1 | 5   |  11
其中第一行的“perc”表示id为1的牌组中有11%的牌具有cmc 1。

解决了这个问题

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;
我还发布了这个问题的简单版本的解决方案。

解决了它

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;

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

您是否介意包括一小部分数据(正如所提到的问题中的一部分),并可能同时显示所需的输出?您是否介意包括一小部分数据(正如所提到的问题中的一部分),并可能同时显示所需的输出?