在postgresql中模糊匹配重复项并将重复项移动到新表中

在postgresql中模糊匹配重复项并将重复项移动到新表中,sql,postgresql,similarity,Sql,Postgresql,Similarity,我有一个用户表,它有以下字段 id、名、姓、街道地址、城市、州、邮政编码、公司、用户标识符、创建地址、更新地址。 这张表有很多重复项 我想模糊匹配他们的名字,姓氏和街道地址 这就是我所做的 我创建了一个包含以下字段的新表 CREATE TABLE dupes( id bigint NOT NULL, first_name TEXT, last_name TEXT, street_address CHAR(50), searched_n

我有一个用户表,它有以下字段 id、名、姓、街道地址、城市、州、邮政编码、公司、用户标识符、创建地址、更新地址。 这张表有很多重复项

我想模糊匹配他们的名字,姓氏和街道地址

这就是我所做的

我创建了一个包含以下字段的新表

CREATE TABLE dupes(
   id  bigint NOT NULL,
   first_name    TEXT,
   last_name      TEXT,
   street_address        CHAR(50),
   searched_name TEXT,
   searched_user_id bigint
);
接下来,我有一个func,它应该在字段中循环,并插入到相似性在`.75以上的新表副本中

DO 
$$
DECLARE 
    rec record;
    full_name varchar;
BEGIN
    FOR rec IN 
    SELECT id, first_name ||' '||last_name ||' '||street_address full_name 
    FROM users

    LOOP
        INSERT INTO dupes(id,first_name,last_name, street_address,searched_name, searched_user_id)
        SELECT id,first_name,last_name, street_address,rec.full_name,rec.id 
        FROM users
        WHERE similarity(first_name ||' '||last_name||' '||street_address, rec.full_name) > .75
        and  id<>rec.id;
    END LOOP;
END
$$;
不幸的是,返回的每一行都有更多的副本

这方面我还不太熟悉。有人能帮忙吗


谢谢

这不需要程序编程。基于集合进行操作甚至可以避免太多重复项…;-

首先:

WITH
Matching (id, first_name, last_name, street_address, searched_name, searched_user_id) AS (
  SELECT DISTINCT
    l.id
    , l.first_name
    , l.last_name
    , l.street_address
    , r.first_name || ' ' || r.last_name
    , r.id
  FROM Users l
  JOIN Users r
    ON SIMILARITY(l.first_name || ' ' || l.last_name || ' ' || l.street_address,
                  r.first_name || ' ' || r.last_name || ' ' || r.street_address) > .50
       AND l.id < r.id
)
-- SELECT * FROM Matching
INSERT INTO Dupes (id, first_name, last_name, street_address, searched_name, searched_user_id)
  (SELECT id, first_name, last_name, street_address, searched_name, searched_user_id FROM Matching)
;
为了说明三个记录之间的匹配而不需要太多的字母推送,对阈值进行了调整

在行动中看到它:


如果需要调整/进一步详细信息,请发表意见。

这很有帮助。非常感谢你。我只需要使id唯一,添加冲突id在插入时不做任何操作,这样我就不会得到重复的id。@MarianaLungu:请确保这对您的真实数据有预期的影响/有助于您随后的处理。DISTINCT已经在记录级别防止了重复-但不仅仅是id。-因此,对于id和搜索的用户id的组合,返回的集是唯一的。-只要考虑传递闭包和最小集…