Найти дубликаты имен с разными dob tsql (T-SQL) - PullRequest
0 голосов
/ 04 ноября 2019

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

Я пробовал CTE и комбинацию Group By и Have.

declare @person table (id int, e_name nvarchar(50), dob datetime)

INSERT @person VALUES (1,'Jack Hughens','1960-11-02')
INSERT @person VALUES (2,'Tom Hughens','1971-01-08')
INSERT @person VALUES (3,'Sam Scallion','1960-11-02')
INSERT @person VALUES (4,'Sam Scallion','1960-11-01')
INSERT @person VALUES (5,'Paul Darty','1994-10-19')
INSERT @person VALUES (6,'Paul Ashley','1983-09-21')

Результат должен быть таким:

--------------------------------
|id|e_name         |dob         |
--------------------------------
|3|Sam Scallion   |1960-11-02  |
--------------------------------
|4|Sam Scallion   |1960-11-01  |
--------------------------------

Ответы [ 2 ]

4 голосов
/ 04 ноября 2019

Если id установлено автоматически, вы можете сделать:

select p.*
from @person p
where exists (select 1 from @person p1 where p1.e_name = p.e_name and p.id <> p1.id);

Однако вы также можете использовать dob вместо id :

select p.*
from @person p
where exists (select 1 from @person p1 where p1.e_name = p.e_name and p.dob <> p1.dob);
2 голосов
/ 04 ноября 2019

Мое предложение использует GROUP BY с HAVING -классом:

Таблица макетов для имитации вашей проблемы

declare @person table (id int, e_name nvarchar(50), dob datetime)

INSERT @person VALUES (1,'Jack Hughens','19601102')
INSERT @person VALUES (2,'Tom Hughens', '19710108')
INSERT @person VALUES (3,'Sam Scallion','19601102')
INSERT @person VALUES (4,'Sam Scallion','19601101')
INSERT @person VALUES (5,'Paul Darty',  '19941019')
INSERT @person VALUES (6,'Paul Ashley', '19830921');

- Запрос

WITH FindNames AS
(
    SELECT p.e_name
    FROM @person p
    GROUP BY p.e_name
    HAVING COUNT(DISTINCT p.dob)>1
)
SELECT p.*
FROM @person p
INNER JOIN FindNames n ON p.e_name=n.e_name;

идея вкратце:

Использование COUNT(DISTINCT p.dob) приведет к подсчету отличающихся только значений.
CTE вернет имена, где вы видите более одного, но разные DOB.
Последний SELECT присоединится к набору CTE, следовательно, используя его в качестве фильтра.

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