Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres统计每组的总匹配数 输入数据_Postgresql - Fatal编程技术网

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。谢谢。我喜欢第一个!我不知道过滤器。。。这太棒了!我喜欢第一个!我不知道过滤器。。。这太棒了!