Получить пересечение и объединение строк в postgresql - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь создать запрос, чтобы найти сходство имен между двумя источниками и выбрать наилучшее совпадение.перед этим мне нужно вычислить объединение и пересечение имен.

У меня есть 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|
...