Поиск повторяющихся строк в SQL Server на основе сопоставления символов - PullRequest
0 голосов
/ 30 ноября 2018

Я хотел бы найти повторяющиеся строки в таблице на основе соответствия двум условиям.Первое условие, сопоставьте данные в поле LastName.Второе условие: сопоставьте только первые три символа данных в поле FirstName.

Например, следует выбрать следующие две строки:

LastName       FirstName

 Williams       Robert

 Williams       Robbie

Я попытался построить решение RedFilter: Поиск дублирующихся строк в SQL Server , но возвращается 0 записей.Вот мой запрос;

SELECT a.ObjGUID, a.LastName, a.FirstName, a.EmailAddress, ac.duplicateCount
FROM [Users].[dbo].[Known_Dupes_4] a
INNER JOIN (
SELECT
 LastName, FirstName, COUNT(*) AS duplicateCount
FROM [Users].[dbo].[Known_Dupes_4]
GROUP BY
 LastName, FirstName
HAVING 
 COUNT(*) > 1
) ac ON (UPPER(a.LastName) = UPPER(LTRIM(RTRIM(ac.LastName))) AND LEFT (UPPER(LTRIM(RTRIM(a.FirstName))),3) LIKE LEFT (UPPER(LTRIM(RTRIM(ac.FirstName))),3))
ORDER BY
 a.LastName, a.FirstName

Спасибо

обновлено - похоже, работает

SELECT a.EmployeeID, a.LastName, a.FirstName, a.EmailAddress, ac.duplicateCount
FROM [Users].[dbo].[Known_Dupes_4] a
INNER JOIN (
SELECT
LEFT(FirstName,3) as firstNameShort, COUNT(*) AS duplicateCount, LastName
FROM [Users].[dbo].[Known_Dupes_4]
GROUP BY
LastName, LEFT(FirstName,3)
HAVING 
COUNT(*) > 1
) ac ON (a.LastName) = ac.LastName AND LEFT (a.FirstName,3) LIKE LEFT (ac.firstNameShort,3)
ORDER BY a.LastName, a.FirstName

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Вы можете группировать по LEFT (FirstName, 3), например:

    declare @t table (firstName nvarchar(20), lastname nvarchar(20))

    insert into @t
    values ('Robert', 'Williams'), ('Robbie', 'Williams'), ('NotRob', 'Williams'),  ('Steve', 'Other'), ('Steven', 'Other'), ('Someone', 'Else'), ('Roberto', 'Williams')

    select t1.* from @t t1
    cross apply (
            select
                LEFT(firstName, 3) as firstNameShort, lastname
            from
                @t t2
            where LEFT(t2.firstName, 3) = LEFT(t1.firstName, 3)
                and t2.lastname = t1.lastname
            group by
                lastname, LEFT(firstName, 3) 
            having 
                COUNT(*) > 1) t3
    order by t1.lastname, t1.firstName
0 голосов
/ 30 ноября 2018

Вот как я использую CTE и SUM () over (), чтобы получить только дубликаты.

create table #example
(
    LastName varchar(25)      
   ,FirstName varchar(25)
)

INSERT INTO #example
VALUES
     ('Williams','Robert')
    ,('Williams','Robbie')
    ,('Jader','Arruda')
    ,('Jader','Gabriel')

WITH CTE 
AS
(
    SELECT FirstName, LastName,LEFT(FirstName,3) AS First_3_Letter_Name, SUM(1) 
    OVER(PARTITION BY LastName,LEFT(FirstName,3) ORDER BY  
    LastName,LEFT(FirstName,3)) AS ID
    FROM #example
)
SELECT * FROM CTE AS a
WHERE ID > 1;
0 голосов
/ 30 ноября 2018

Один из вариантов - получить COUNT () и разделить его по LastName и первым 3 символам FirstName, а затем отфильтровать.

Посмотрите на это:

DECLARE @TestData TABLE
    (
        [FirstName] NVARCHAR(100)
      , [LastName] NVARCHAR(100)
    );

INSERT INTO @TestData (
                          [FirstName]
                        , [LastName]
                      )
VALUES ( ' Robert ', 'Williams' )
     , ( 'Robbie', 'Williams ' )
     , ( 'Robin', ' Williams ' )
     , ( ' Rodger', 'Williams' ); --This one doesn't get returned

SELECT *
FROM   (
           SELECT *
                , COUNT(*) OVER ( PARTITION BY LTRIM(RTRIM([LastName]))
                                             , SUBSTRING(
                                                            LTRIM(RTRIM([FirstName]))
                                                          , 1
                                                          , 3
                                                        )
                                ) AS [DupNameCount]
           FROM   @TestData
       ) AS [Dup]
WHERE  [Dup].[DupNameCount] > 1;
...