2017-02-21 4 views
0

У меня есть таблица создать подобную следующий:Выбор конкретного дубликата записи

Userid | LastFirstMI | Active 
    1  Doe, Jane S  False <<< 
    2  Doe, Jane S  True 
    3  Smith, John P False 
    4  Lee, Bob R  False 
    5  Bob, Joe L  False <<< 
    6  Bob, Joe L  True 

Я желающий выбрать только дублирующиеся имена с активным значением false. Я указал строки с < < <. Я искал и нашел похожие вопросы, но, похоже, я не могу найти тот, который показывает, как выбрать конкретный дубликат. Заранее спасибо.

+0

который Д.Б., что вы используете? – scaisEdge

ответ

0

Это возвратит дубликаты, где Active = 'False' когда имеется соответствующая учетная запись Active = 'True'.

select userid, LastFirstMI, Active 
from t 
where t.Active = 'False' 
    and exists (
    select 1 
    from t as i 
    where i.LastFirstMi = t.LastFirstMi 
     and i.Active = 'True' 
) 

Это будет возвращать все дубликаты, где Active = 'False' даже если Eсть не соответствующий Active = 'True' счет.

select userid, LastFirstMI, Active 
from t 
where t.Active = 'False' 
    and exists (
    select 1 
    from t as i 
    where i.LastFirstMi = t.LastFirstMi 
     and i.UserId <> t.UserId 
) 
+0

Это отлично работает! Спасибо за помощь. Я очень ценю это. – Matthew

+0

@Matthew рад помочь! – SqlZim

0
select t1.userid, t1.LastFirstMI, t1.Active from table t1,table t2 
where t1.active='False' and t1.LastFirstMI=t2.LastFirstMI and t2.active='True' 

Попробуйте код выше и измените active=False состояние в соответствии с вашей БД двигателя, если это необходимо.

+0

где условие должно совпадать с количеством столбцов - это подзаголовок – scaisEdge

+0

Исправлено, вы можете проверить. –

0

Предполагая, что ваша колонка активна является строкой

Это должно работать в MySQL и SQLServer

select * from my_table where 
Active = 'False' and LastFirstMi in (
    select t.LastFirstMi from ( 
    select LastFirstMI, count(*) 
    from my_table 
    group LastFirstMI 
    having count(*)>1 
) t 
) 
0

Вы можете использовать row_number в большинстве баз данных:

Select * 
From (
    Select t.* 
    ,row_number() over (partition by lastfirstMI order by Active) rn 
    From your_table t 
) t where rn = 1 
+0

Это будет возвращать записи с 'Active = 'True'', если нет дубликатов. 'где rn = 1 и Active = 'false'' - это один из способов исправить это. – SqlZim

0
with x as (
select Userid, LastFirstMI,Active 
     , row_number() over (partition by LastFirstMI order by Active desc) as row_number 
from table 
) 

select * from x 
where Active = 'False' 
     and row_number >= 2 
Смежные вопросы