在PostgreSQL中找到由Y组成的每个X的比例?
我有一个很大的魔法数据库:收集卡片和装饰清单。卡牌表包含每张卡牌的类型和转换法力消耗(以及其他)。牌组使用两个表存储:一个牌组本身的表称为“牌组”,另一个表称为“牌组成员”,其中每行包含牌组的ID、该牌组中包含的牌的ID以及牌组中出现的该牌的副本数 我想要的是该数据的视图,其中的行是: 甲板:甲板的ID cmc:该牌组中至少一张牌上显示的转换法力消耗 比例:该牌组中具有该cmc的非地卡的百分比 还是我最好用Python或R之类的语言导出这些数据 编辑: 既然你问了,下面是一些示例数据: 卡片:在PostgreSQL中找到由Y组成的每个X的比例?,postgresql,Postgresql,我有一个很大的魔法数据库:收集卡片和装饰清单。卡牌表包含每张卡牌的类型和转换法力消耗(以及其他)。牌组使用两个表存储:一个牌组本身的表称为“牌组”,另一个表称为“牌组成员”,其中每行包含牌组的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;
我还发布了一个问题的简单版本的解决方案。您是否介意包括一小部分数据(正如所提到的问题中的一部分),并可能同时显示所需的输出?您是否介意包括一小部分数据(正如所提到的问题中的一部分),并可能同时显示所需的输出?