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