Я пытаюсь создать запрос, чтобы найти сходство имен между двумя источниками и выбрать наилучшее совпадение.перед этим мне нужно вычислить объединение и пересечение имен.
У меня есть cte, где у меня есть имя и фамилия из двух источников, преобразованных в массив через UNNEST.И их идентификаторы.Эта временная таблица - это то, над чем я работаю (результат 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
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|
ИЛИ (счетна основе имени и второго имени отдельно)
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|