2017-02-10 4 views
1

У меня есть следующая таблица в SQL Server 2012:SQL Server: устранение дубликатов на основе двух столбцов

enter image description here

нужно выбрать отдельные строки и только чей контакт равен «Own». Результат должен нравится:

enter image description here

Я попробовал следующий запрос:

with cte as 
(
    select 
     row_number() over (partition by contact order by SiteNum) rn, 
     SiteNum, SiteAdd, Description, Contact 
    from 
     Name 
) 
select * 
from cte 
where rn = 1 

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

ответ

1

Думаю, что вам необходимо разделить SiteNum и заказать Contact, что противоположно тому, что вы делали. Но кроме этого, ваш подход кажется на правильном пути. Попробуйте этот запрос:

with cte as 
(
    select row_number() over (partition by SiteNum 
     order by case when Contact = 'Own' then 0 else 1 end) rn, 
     SiteNum, SiteAdd, Description, Contact 
    from Name 
) 
select * from cte 
where rn = 1 

Обратите внимание, что я использовал выражение CASE для пункта ORDER BY, который явно проверяет наличие контакта под названием «Own». Мы могли бы попытаться использовать MIN() или 10 и полагаться на несоответствующие записи, имеющие NULL, но это может привести к проблемам позже, если ваша таблица имеет другие значения контактов, кроме «Собственные».

0

Это где положение должно дать вам то, что вы ожидаете

Select DISTINCT SiteAdd from table where Contact = 'Own' 

Вы можете поставить отчетливый на всем подряд и, в случае, если есть повторяющиеся строки.

Select DISTINCT * from table where Contact = 'Own' 

Ваш исходный запрос будет работать на основе логики. Просто измените опечатку:

wehre гп = 1, где гп = 1

Надеется, что это помогает.

+0

Если я включаю where contact = 'Own', я не буду возвращать номер строки 2 (SiteNum 2). – user2536008

 Смежные вопросы

  • Нет связанных вопросов^_^