Найти уникальную запись для повторяющихся записей в двух столбцах - PullRequest
0 голосов
/ 24 октября 2018

Это мой набор данных базы данных:

Таблица

ID             Name

XXX-23305      Edward, Stue^Jenna
XXX-23305      Edward, Stue^Jenna
XXX-23306      Cole, Slaw^Bali
XXX-23306      Cole, Slaw^Bali
XXX-23306      Cole, Slaw^Bali
XXX-23310      Zerg, War^Finja
XXX-23310      Road^Sieglinde
XXX-23319      Gras, Dr.Carl^Yolo
XXX-23319      Gras, Dr.Carl^Yolo

Как видите, для одной комбинации идентификатора и имени может быть несколько записей.Однако в случае идентификатора XXX-23310 доступны два разных имени.

Теперь мне нужно отобразить этот точный набор данных (у меня есть база из примерно 31 тыс. Записей с неизвестным количеством этих записей).

Есть ли способ достичь этого?Некоторое время я гуглил и тоже просматривал другие посты, но ничего не смог найти.

EDIT1: Желаемый результат запроса:

ID             Name

XXX-23310      Zerg, War^Finja
XXX-23310      Road^Sieglinde

EDIT2:

Не уверен, что кто-нибудь читает это, но спасибо за решения.Я хочу добавить еще одно условие.Выводить данные только в том случае, если для идентификатора имеется более одной записи.Например, если мой образец набора данных будет содержать только одну запись для XXX-23310, то в результате запрос ничего не напечатает.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

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

DECLARE @DataSource TABLE
(
    [ID] VARCHAR(32)
   ,[Name] VARCHAR(25)
);

INSERT INTO @DataSource ([ID], [Name])
VALUES ('XXX-23305', 'Edward, Stue^Jenna')
      ,('XXX-23305', 'Edward, Stue^Jenna')
      ,('XXX-23306', 'Cole, Slaw^Bali')
      ,('XXX-23306', 'Cole, Slaw^Bali')
      ,('XXX-23306', 'Cole, Slaw^Bali')
      ,('XXX-23310', 'Zerg, War^Finja')
      ,('XXX-23310', 'Road^Sieglinde')
      ,('XXX-23319', 'Gras, Dr.Carl^Yolo')
      ,('XXX-23319', 'Gras, Dr.Carl^Yolo');

WITH DataSource AS
(
    SELECT [ID]
          ,[Name]
          ,COUNT(*) OVER (PARTITION BY [ID], [Name]) AS [ID_Name_Count]
          ,COUNT(*) OVER (PARTITION BY [ID]) AS [ID_Count]
    FROM @DataSource
)
SELECT [ID]
      ,[Name]
FROM DataSource
WHERE [ID_Name_Count] = 1
    AND [ID_Count] = 2;

enter image description here

0 голосов
/ 24 октября 2018

Если вы также хотите исключить любые одиночные записи для данного идентификатора:

create table #data
(
    id varchar(10),
    [name] varchar(50)
)

insert into #data
values
    ('XXX-23305','Edward, Stue^Jenna'),
    ('XXX-23306','Cole, Slaw^Bali'),
    ('XXX-23306','Cole, Slaw^Bali'),
    ('XXX-23306','Cole, Slaw^Bali'),
    ('XXX-23310','Zerg, War^Finja'),
    ('XXX-23310','Road^Sieglinde'),
    ('XXX-23319','Gras, Dr.Carl^Yolo'),
    ('XXX-23319','Gras, Dr.Carl^Yolo');

with d as
(   
    select distinct
        id,
        [name]
    from #data
)
select *
from d
where d.id in
(   
    select d.id
    from d
    group by d.id
    having count(*) > 1
)

drop table #data

Возвращает две записи для XXX-23310, но не XXX-23305, как это делают другие ответы:

/-----------------------------\
| id        | name            |
|-----------|-----------------|
| XXX-23310 | Road^Sieglinde  |
| XXX-23310 | Zerg, War^Finja |
\-----------------------------/
0 голосов
/ 24 октября 2018

использовать функцию агрегации в фильтре

Поскольку вы хотите учитывать только несколько идентификаторов, используйте ниже одного

select id,name from @your_table t
group by id,name
having count(*)=1
and exists (select 1 from @your_table t1 where t1.id=t.id
                          group by t1.id having count(*)>1
                           )

DEMO в скрипте

вывод

id            name
XXX-23310   Road^Sieglinde
XXX-23310   Zerg, War^Finja
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...