繁体   English   中英

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

[英]Fuzzy matching duplicates in postgresql and move the duplicates to a new table

我有一个 User 表,其中包含以下字段id, first_name, last_name, street_address, city, state, zip-code, firm, user_identifier, created_at, update_at 这张表有很多重复。

我想通过first_name, last_name and street_address模糊匹配它们。

这是我所做的

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

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 它应该遍历字段并插入到新表( dupes )中,其中相似度高于 ```.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)
;

(为了说明三个记录之间的匹配没有太多的字母推送,阈值已调整......)

查看实际操作: SQL Fiddle

请评论,如果这需要调整/进一步的细节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM