在Postgresql中获取字符串的交集和并集

时间:2019-06-05 15:59:41

标签: postgresql union common-table-expression intersect

我正在尝试建立查询以查找两个来源之间的名称相似性并选择最佳匹配。在此之前,我需要计算名称的并集和交集。

我有一个cte,其中我的名字和名字来自两个通过UNNEST转换为数组的源。及其相关的ID。这个临时表就是我正在处理的(cte的结果就是这个)

WITH  fakedata (source1, source2, source1id, source2id) AS (VALUES ('firstNameA','firstNameA',16,20), ('secondNameA','secondNameA',16,20),
('firstNameB','firstNameA',17,20), ('secondNameB','secondNameA',17,20)) 
select * from fakedata;

source1    |source2    |source1id|source2id     |
-----------|-----------|---------|--------------|
firstNameA |firstNameA |       16|            20|
secondNameA|secondNameA|       16|            20|
firstNameB |firstNameA |       17|            20|
secondNameB|secondNameA|       17|            20|

目标是在source1和source2之间获得名称的交集和并集。我尝试了PostgreSQL aggregate union, intersection and set differences

给出的这个示例
SELECT p.*, 
      (select count(*)
       from (
         select v.source1 from fakedata v 
         intersect
         select v.source2 from fakedata v 
       ) t) as intersection,
       (select count(*)
       from (
         select v.source1 from fakedata v 
         union
         select v.source2 from fakedata v 
       ) t) as union

from fakedata p

我得到的结果:

source1    |source2    |source1id|source2id     |intersection|union|
-----------|-----------|---------|--------------|------------|-----|
firstNameA |firstNameA |       16|            20|           2|    4|
secondNameA|secondNameA|       16|            20|           2|    4|
firstNameB |firstNameA |       17|            20|           2|    4|
secondNameB|secondNameA|       17|            20|           2|    4|

但是问题是,即使交集应为零的行,它也会为每一行计数

可接受的结果是(基于firstName和secondName两者的组合计算)

source1    |source2    |source1id|source2id     |intersection|union|
-----------|-----------|---------|--------------|------------|-----|
firstNameA |firstNameA |       16|            20|           2|    2|
secondNameA|secondNameA|       16|            20|           2|    2|
firstNameB |firstNameA |       17|            20|           0|    4|
secondNameB|secondNameA|       17|            20|           0|    4|

OR(分别基于firstName和secondName进行计数)

source1    |source2    |source1id|source2id     |intersection|union|
-----------|-----------|---------|--------------|------------|-----|
firstNameA |firstNameA |       16|            20|           1|    1|
secondNameA|secondNameA|       16|            20|           1|    1|
firstNameB |firstNameA |       17|            20|           0|    2|
secondNameB|secondNameA|       17|            20|           0|    2|

0 个答案:

没有答案