Postgresql Postgres统计每组的总匹配数 输入数据
我有以下关联表:Postgresql Postgres统计每组的总匹配数 输入数据,postgresql,Postgresql,我有以下关联表: AssociationTable - Item ID: Integer - Tag ID: Integer 参考以下示例数据 Item Tag 1 1 1 2 1 3 2 1 和一些标签T的输入列表(例如[1,2]) 我想要什么 对于每个项目,我想知道输入列表T中没有提供哪些标签 通过我们的样本数据,我们可以得到: Item Num missing 1 1 2 0 我的想法 到目前为止,我所做的最好的事情是:选
AssociationTable
- Item ID: Integer
- Tag ID: Integer
参考以下示例数据
Item Tag
1 1
1 2
1 3
2 1
和一些标签T的输入列表(例如[1,2]
)
我想要什么
对于每个项目,我想知道输入列表T中没有提供哪些标签
通过我们的样本数据,我们可以得到:
Item Num missing
1 1
2 0
我的想法
到目前为止,我所做的最好的事情是:选择“ItemId”,从“AssociationTab”中将(“TagId”)计数为“nummissing”,其中“TagId”不在“ItemId”的(1)组中代码>
这里的问题是,所有标记匹配的项目将不包括在输出中。您可以使用具有反连接方法的日历表:
WITH cte AS (
SELECT t1.Item, t2.Tag
FROM (SELECT DISTINCT Item FROM AssociationTable) t1
CROSS JOIN (SELECT 1 AS Tag UNION ALL SELECT 2) t2
)
SELECT
t1.Item,
COUNT(*) FILTER (WHERE t2.Item IS NULL) AS num_missing
FROM cte t1
LEFT JOIN AssociationTable t2
ON t1.Item = t2.Item AND
t1.Tag = t2.Tag AND
t2.Tag IN (1, 2)
GROUP BY
t1.Item;
这里的策略是在第一个CTE中构建一个日历/参考表,其中包含项目和标记的所有组合。然后,我们将此CTE加入到您的关联表中,按项目聚合,然后检测每个项目缺少多少标记。您可以使用具有反连接方法的日历表:
WITH cte AS (
SELECT t1.Item, t2.Tag
FROM (SELECT DISTINCT Item FROM AssociationTable) t1
CROSS JOIN (SELECT 1 AS Tag UNION ALL SELECT 2) t2
)
SELECT
t1.Item,
COUNT(*) FILTER (WHERE t2.Item IS NULL) AS num_missing
FROM cte t1
LEFT JOIN AssociationTable t2
ON t1.Item = t2.Item AND
t1.Tag = t2.Tag AND
t2.Tag IN (1, 2)
GROUP BY
t1.Item;
这里的策略是在第一个CTE中构建一个日历/参考表,其中包含项目和标记的所有组合。然后,我们将这个CTE加入到您的关联表中,按项目聚合,然后检测每个项目缺少多少标记。最简单的解决方案是
选择
ItemId,
计数(*)过滤器(其中TagId不在(1,2)中)
来自AssociationTab
按项目ID分组
或者,如果您已经有一个带有项目列表的项目表,则可以执行以下操作:
选择
i、 ItemId,
计数(a.TagId)
第i项
a.ItemId=i.ItemId和a.TagId上的左联接关联选项卡a不在(1,2)中
按i.ItemId分组
关键是如果没有匹配的标记,LEFT JOIN不会删除项
行。最简单的解决方案是
选择
ItemId,
计数(*)过滤器(其中TagId不在(1,2)中)
来自AssociationTab
按项目ID分组
或者,如果您已经有一个带有项目列表的项目表,则可以执行以下操作:
选择
i、 ItemId,
计数(a.TagId)
第i项
a.ItemId=i.ItemId和a.TagId上的左联接关联选项卡a不在(1,2)中
按i.ItemId分组
关键是,如果没有匹配的标记,LEFT JOIN不会删除项
行。我看不出您显示的输出与您描述的所需输出是什么样的。项目1有标签1、2和3(列表中无遗漏),项目2有标签1。列表中缺少标记2。请解释。@bjarniranason我正在传递[1,2],所以项目1缺少标记3,项目2没有缺少任何标记,因为我看到的输入列表中有标记1。谢谢。我看不出您所展示的输出是如何与您所描述的期望输出相符的。项目1有标签1、2和3(列表中无遗漏),项目2有标签1。列表中缺少标记2。请解释。@bjarniranason我正在传递[1,2],所以项目1缺少标记3,项目2没有缺少任何标记,因为我看到的输入列表中有标记1。谢谢。我喜欢第一个!我不知道过滤器。。。这太棒了!我喜欢第一个!我不知道过滤器。。。这太棒了!