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

    declare @t table(personid int, first_name varchar(50), last_name varchar(50), ssn int)
    insert into @t
    values(1, 'Roman', 'Smith', 12),
    (2, 'John', 'Thomas', 15),
    (3, 'John', 'Thomas', 15)

В этом случае я только хочу вернуть Романа Смита и полностью уничтожить Джона Томаса.

Я играл с Window Functions, и мне удалось продвинуться так далеко:

    select * from
    (
    select person_id, first_name, last_name, middle_initial, ssn,
    row_number() over(partition by ssn, first_name, last_name, middle_initial order by person_id) as 
    rn
    from t_person
    where person_id in (1, 2, 3)
    )a
    where rn = 1
1
jackstraw22 19 Дек 2019 в 22:03

4 ответа

Лучший ответ

В этом сценарии мне нравится использовать НЕ СУЩЕСТВУЕТ. Простой способ выполнить устранение.

SELECT * 
FROM @t AS T 
WHERE NOT EXISTS (SELECT 1 FROM @t WHERE ssn = T.ssn GROUP BY ssn HAVING COUNT(*) > 1)
3
Chris Albert 19 Дек 2019 в 19:24

Вы можете использовать оператор «LIKE», чтобы получить все имена, которые соответствуют заданному шаблону, и полностью удалить их из вашей базы данных.

DELETE FROM name таблицы

ГДЕ first_name НРАВИТСЯ '% $ name%'

Это удалит все экземпляры данного «имени», однако это можно использовать, только если у вас уже есть представление о повторяющихся данных.

0
Kishan Kamlesh 19 Дек 2019 в 19:17

Вы можете попробовать использовать GROUP BY и HAVING.

SELECT max(person_id) person_id,
       first_name,
       last_name,
       ssn
       FROM @t
       GROUP BY first_name,
                last_name,
                ssn
       HAVING count(*) = 1;
1
sticky bit 19 Дек 2019 в 19:22

Если вы хотите использовать window function, вот один из способов сделать это ..

select personid, first_name, last_name, ssn
from (select *, count(*) over (partition by first_name, last_name, ssn) freq from @t) a 
where freq=1;

DEMO

1
Gandalf 20 Дек 2019 в 02:40
59415546