Ищем дубликаты с помощью DIFFERENCE () среди 2+ столбцов - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь написать запрос SQL Select, который использует функцию DIFFERENCE () для поиска похожих имен в базе данных для выявления дубликатов.

Короткая версия используемого мной кода :

SELECT *, DIFFERENCE(FirstName, LEAD(FirstName)  OVER (ORDER BY SOUNDEX(FirstName))) d
WHERE d >= 3

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

Примеры данных:

+----+--------+--------+--------+--------+
|ID  |First   |Middle  |AKA1    |AKA2    |
+----+--------+--------+--------+--------+
|1   |Sally   |Ann     |NULL    |NULL    |
|2   |Ann     |NULL    |NULL    |NULL    |
|3   |Sue     |NULL    |NULL    |NULL    |
|4   |Suzy    |NULL    |NULL    |NULL    |
|5   |Patricia|NULL    |Trish   |Patty   |
|6   |Patty   |NULL    |Patricia|Trish   |
|7   |Trish   |NULL    |Patty   |Patricia|
+----+--------+--------+--------+--------+

В приведенном выше примере строки 1 + 2 дублируют друг друга, как 3 + 4 и 5 + 6 + 7.

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

WITH A AS (SELECT *,
    SOUNDEX(FirstName) AS "FirstSoundex",
    SOUNDEX(LastName) AS "LastSoundex",
    LAG (SOUNDEX(FirstName)) OVER (ORDER BY SOUNDEX(FirstName)) AS "PreviousFirstSoundex",
    LAG (SOUNDEX(LastName)) OVER (ORDER BY SOUNDEX(LastName)) AS "PreviousLastSoundex"
    FROM Clients),

B AS (
    SELECT *,
    ISNULL(DIFFERENCE(FirstName, LEAD(FirstName)  OVER (ORDER BY FirstSoundex)),0) AS "FirstScore",
    ISNULL(DIFFERENCE(LastName, LEAD(LastName)  OVER (ORDER BY LastSoundex)),0) AS "LastScore"
    FROM A),

C AS (
    SELECT *,
        ISNULL(LAG (FirstScore) OVER (ORDER BY FirstSoundex),0) AS "PreviousFirstScore",
        ISNULL(LAG (LastScore) OVER (ORDER BY LastSoundex),0) AS "PreviousLastScore"
    FROM B
    ),

D AS (
    SELECT *,
        (CASE WHEN (PreviousFirstScore >=3 AND PreviousLastScore >=3) THEN (PreviousFirstSoundex + PreviousLastSoundex)
            WHEN (FirstScore >= 3 AND LastScore >=3) THEN (FirstSoundex + LastSoundex)
            END) AS "GroupName"
    FROM C
    WHERE ((PreviousFirstScore >=3 AND PreviousLastScore >=3) OR (FirstScore >= 3 AND LastScore >=3))
    )

SELECT *,
        LAG(GroupName) OVER (ORDER BY GroupName) AS "PreviousGroup",
        LEAD(GroupName) OVER (ORDER BY GroupName) AS "NextGroup"
    FROM D

WHERE (D.GroupName = D.PreviousGroup OR D.GroupName = D.NextGroup)

Это позволяет мне сгруппировать пакеты потенциальных дубликатов, и это хорошо работает для меня. Однако теперь я хочу добавить способ проверки нескольких столбцов, и я не знаю, как это сделать.

Я думал о создании объединения, например:

    SELECT ClientID,
        LastName,
        FirstName AS "TempName"
        FROM Clients
    UNION
    SELECT ClientID,
        LastName,
        MiddleName AS "TempName"
        FROM Clients
        WHERE MiddleName IS NOT NULL
...etc

Но тогда мои LAG () и LEAD () не будут работать, потому что у меня будет несколько строк с одним и тем же ClientID. Я не хочу идентифицировать одного Клиента как своего дубликата.

В любом случае, есть предложения? Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...