Маркировка дубликатов записей в таблице - PullRequest
0 голосов
/ 24 мая 2018

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

Данные:

= FirstName | LastName | Company | Group | Status | ID

      x    |    x     |     x   | NULL  | NULL   | 1
      x    |    x     |     x   | NULL  | NULL   | 2

Затем я запускаю этот запрос, чтобы найти совпадения в FirstName, LastName, Company и присоединяю его к основной таблице, чтобы пометить записи:

    with d as (
select ID, FirstName, LAstName, Company, row_number() over (partition by FirstName,LastName, Company order by FirstName,LastName, Company) as nr
from [dbo].xx) 

Update b
set Status = 'S'
, Group = d.DQ_ID
from xx as b inner join d on
b.FirstName = d.FirstName and 
b.LastNAme = d.LastName and
b.Company = d.Company
where d.nr = 1 

И затем обновить основную записьс P

Update b
set Status = 'P'
from xx as b
where b.ID = b.Group
GO

Что я ожидаю:

= FirstName | LastName | Company | Group | Status | ID

      x    |    x     |     x   | 1     |  P     | 1
      x    |    x     |     x   | 1     |  S     | 2

Что я получу:

= FirstName | LastName | Company | Group | Status | ID

      x    |    x     |     x   | 2     |  S     | 1
      x    |    x     |     x   | 1     |  S     | 2

Я работаю над 1М записями - и это случается только с некоторыми из них!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Можно попытаться сделать следующее:

;WITH RankedData AS
(
    SELECT
        T.ID,
        T.[Group],
        T.Status,
        T.FirstName,
        T.LastName,
        T.Company,
        GroupRanking = ROW_NUMBER() OVER (PARTITION BY T.FirstName, T.LastName, T.Company ORDER BY T.ID ASC)
    FROM
        dbo.xx AS T
)
UPDATE T SET
    [Group] = N.ID,
    Status = CASE WHEN T.GroupRanking = 1 THEN 'P' ELSE 'S' END
FROM
    RankedData AS T
    INNER JOIN RankedData AS N ON
        T.FirstName = N.FirstName AND
        T.LastName = N.LastName AND
        T.Company = N.Company AND
        N.GroupRanking = 1

Имейте в виду, что INNER JOIN будет объединять ненулевые имена и компании, имейте в виду, если у вас есть пустые значения в этих столбцах.

0 голосов
/ 24 мая 2018

Попробуйте это:

;with d as (

select 
ID, 
FirstName, 
LAstName, 
Company, 
row_number() over (
    partition by FirstName,LastName, Company 
    order by Id asc -- this was done to keep ordering as per ID
    ) as nr
from [dbo].xx
) ,
e as 
(select * from d where nr=1)
-- e was created to only take the nr=1 rows which will be joined to all similar records
Update b
set Status = case when e.DQ_ID = b.DQ_ID  then 'P' else 'S' end
 -- the set case logic ensures that matching ids get P else S
, Group = e.DQ_ID
from xx as b 
    inner join e on
        b.FirstName = e.FirstName and 
        b.LastNAme = e.LastName and
        b.Company = e.Company
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...