2015-03-03 3 views
0

Мне нужно обновить записи, которые будут соответствовать конкретному запросу, поэтому я пытаюсь выяснить, как найти список повторяющихся значений, где один столбец отличается по значению.Найти дубликаты, где в другом столбце есть разные столбцы

У меня есть следующие определения таблицы

DocumentId (BIGINT) 
NotePopupId (INT) 
IsPopup (BIT) 
Note (NVARCHAR(100)) 

Моя таблица может иметь следующие данные:

1|1|False|Note1 

1|2|False|Note2 

2|1|False|Note1 

2|2|True|Popup1 

3|1|False|Note1 

3|2|True|Popup1 

4|1|False|Note1 

4|2|False|Note2 

Мне нужно возвращать список DocumentId, которые имеют более чем один DocumentId определено, но где Поле IsPopup является True и False и игнорирует те, где все они являются ложными или все истинными.

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

Таким образом, в данном случае, на основании вышеизложенного, было бы вернуть DocumentId 2 и 3.

Спасибо.

ответ

3

Я склонен обращаться с вопросом, как это с помощью group by и агрегации:

select documentId 
from table 
group by documentId 
having min(cast(isPopup as int)) = 0 and max(cast(isPopup as int)) = 1; 
+0

Что ж, это так просто! Никогда не думал, что вы можете использовать агрегаты min & max для определения значений таким образом. Узнал что-то новое! Спасибо :) – Thierry

+0

Быстрый вопрос. Я добавил 'и count (documentid)> 1' к запросу, но я вижу, что результаты одинаковы. Является ли использование Min и/или Max каким-то образом предполагает, что счет будет выше одного? – Thierry

+1

Эти функции не допускают такого предположения. Но проверка двух разных значений в одном столбце потребует, чтобы у вас должно было быть _th минимум_ двух строк для работы. И поэтому 'count (documentid)> 1' автоматически истинно тогда. – shawnt00

2

Ищите Distinct Count и фильтруйте количество членов группы более 1. Попробуйте это.

select DocumentId 
from yourtable 
group by DocumentId 
having count(Distinct IsPopup)>1 

Если вы хотите вернуться documentId, когда есть только один IsPopup затем использовать этот

select DocumentId 
from yourtable 
group by DocumentId 
having count(Distinct IsPopup)>1 or count(IsPopup)=1 
0

Это может быть немного более эффективным

select distinct t1.documentId 
    from table t1 
    join table t2 
    on t1.documentId = t2.documentId 
    and t1.IsPopup = 'true' 
    and t2.IsPopup = 'false' 
0
SELECT documentId 
    from table 
    group by documentId 
    having min(convert(int,isPopup)) != max(convert(int,isPopup)); 
Смежные вопросы