Идентифицировать дубликаты в столбцах с помощью sql (oracle)

#sql #oracle #count #duplicates #having-clause

#sql #Oracle #количество #дубликаты #наличие-предложения

Вопрос:

У меня есть следующий набор данных:

 FLD_NB|RGN_CD
1     |NC
2     |SC
1     |MA
3     |GA
3     |MA
  

Я пытаюсь идентифицировать все записи, которые доступны более чем в 1 RGN_CD , поэтому, например, приведенный выше сценарий FLD_NB=1 доступен как в RGN_CD='NC' , так и RGN_CD='MA'

Какой может быть наилучший способ идентифицировать строки, которые имеют несколько экземпляров FLD_NB через RGN_CD ?

Комментарии:

1. Пожалуйста, добавьте примерные данные и ожидаемые результаты…

2. Как насчет FLD_NB=3 того, что также должно быть одним из таких кандидатов, верно?

3. Пожалуйста, приведите пример требуемых результатов

Ответ №1:

Вы можете использовать group by и having :

 select fld_nb
from mytable
group by fld_nb
having count(*) > 1
  

Это дает вам все fld_nb , которые появляются более одного раза. Или, если вы хотите fld_nb , чтобы у них было более одного отличного rgn_cd , вы можете изменить предложение having на:

 having count(distinct rgn_cd) > 1
  

Комментарии:

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

Ответ №2:

Вероятно, это то, что вам нужно:

 select *
from (
     select t.*
           ,count(*)over(partition by FLD_NB) cnt
     from t
     )
where cnt>1;
  

Полный тестовый пример с результатами:

 with t (FLD_NB,RGN_CD) as (
select 1, 'NC' from dual union all
select 2, 'SC' from dual union all
select 1, 'MA' from dual union all
select 3, 'GA' from dual union all
select 3, 'MA' from dual 
)
select *
from (
     select t.*
           ,count(*)over(partition by FLD_NB) cnt
     from t
     )
where cnt>1;
  

Результаты:

     FLD_NB RG        CNT
---------- -- ----------
         1 NC          2
         1 MA          2
         3 MA          2
         3 GA          2
  

В случае, если вам нужно подсчитать только отдельные значения:

 select *
from (
     select t.*
           ,count(distinct RGN_CD)over(partition by FLD_NB) cnt
     from t
     )
where cnt>1;
  

Комментарии:

1. да, это ожидаемый мной набор результатов, однако в этой таблице, как обычно, есть множество других столбцов наряду с этими двумя основными столбцами, в которых я должен идентифицировать дубликаты — я проверил sql, изменив имена столбцов на основные 2 столбца, однако результирующий набор по-прежнему выдает больше строк, которые я не хотел видеть … например, если у меня есть FLD_NB = 22, и в нем есть 7 строк с одинаковым RGN_CD =NA, все равно возвращаются те строки, которые я не хочу, потому что FLD_NM = 22 не повторяется ни в каком другом RGN_CD

2. @sourabhbhattacharya ах, хорошо, так что просто измените count(*)over на count(distinct RGN_CD) over

3. Отлично, поэтому, пожалуйста, отметьте ответ как правильный идентификатор, он работает для вас