2017-01-23 1 views
2

Итак, у меня есть SQL, который добавит код в поле, если он обнаружит дубликаты. Не Существует еще одно поле под названием DSКак удалить дубликаты из моего файла, в то время как определенные поля имеют приоритет?

DS может быть либо «да», или он не может быть «нет»

Как я могу сделать это так, если он находит дубликат, «да» не кодируются и «нет» является?

По существу «да» получает приоритет.

My SQL:

WITH cte 
    AS (SELECT *, 
       Row_Number() OVER(partition BY fips_county_code, last, suffix, first, birthdate Order by (select null)) AS Rn 
     FROM [PULLED REC]) 
UPDATE cte 
SET BAD_CODES = Isnull(BAD_CODES, '') + 'D' 
WHERE RN > 1; 
+0

Почему может» t вы устанавливаете DS на «нет»? – Anand

+0

Я не понимаю, что вы здесь делаете. Вы хотите обновить все строки для дубликата? Вы игнорируете столбец DS, чтобы определить, является ли он дубликатом? Без каких-либо деталей таблицы и того, что вы пытаетесь сделать, на самом деле трудно ответить. –

+0

@SeanLange Я хочу, чтобы обновить все строки для дублей, но говорят, что если у нас есть две записи Имя: Sam DS: да Имя: Сэм DS: нет Тогда мы только закодировать DS = нет. – rohanharrison

ответ

2

Чтобы обновляемые строки, в которых ds='No' можно добавить, что в пункте where.

Чтобы убедиться rn > 1 не пропуская один из ваших дубликатами, что вам нужно обновить, вы можете использовать exists() альтернативу count()

with cte as (
    select 
     * 
    , rn = row_number() over (
      partition by fips_county_code, last, suffix, first, birthdate 
      order by (case when DS = 'yes' then 0 else 1 end) asc 
      ) 
    from [pulled rec] 
) 
/* -- check with select first -- */ 
select * from cte 

/* 
update cte set 
    bad_codes = isnull(bad_codes, '') + 'D' 
--*/ 
/* -- Update all records that have a duplicate 
    -- except the First row, ordered by ds='Yes' first */ 
/* 
    where cte.ds = 'No' 
    and cte.rn > 1 
--*/ 
-- Update all records that have a duplicate and ds='No' -- 
--/* 
    where cte.ds = 'No' 
    and exists (
     select 1 
     from cte as i 
     where i.rn > 1 
      and i.fips_county_code = cte.fips_county_code 
      and i.last = cte.last 
      and i.suffix = cte.suffix 
      and i.first = cte.first 
      and i.birthdate = cte.birthdate 
    ); 
--*/ 

Альтернативный вариант с использованием count() over():

with cte as (
    select 
     * 
    , CountOver = count() over (
      partition by fips_county_code, last, suffix, first, birthdate 
      ) 
    from [pulled rec] 
) 
/* -- check with select first -- */ 
select * from cte 

/* 
update cte set 
    bad_codes = isnull(bad_codes, '') + 'D' 
--*/ 

    where cte.ds = 'No' 
    and cte.CountOver > 1 
0

Я думаю, что это должно заставить вас в правильном направлении.

WITH cte 
    AS (SELECT *, 
       Row_Number() OVER(partition BY fips_county_code, last, suffix, first, birthdate Order by (select null)) AS Rn 
       , COUNT(*) as DupeCount 
     FROM [PULLED REC] 
     group by fips_county_code, last, suffix, first, birthdate --and whatever other columns are present 
) 
UPDATE cte 
SET BAD_CODES = case RN when 1 then BAC_CODES else Isnull(BAD_CODES, '') + 'D' end 
    , DS = Case DupeCount when 1 then 'no' else 'yes' end 
Смежные вопросы