2015-11-04 4 views
0

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

person_number------------name 
============================== 
1234567------------------john 
00004567-----------------mark 
9999999------------------mike 
0009999------------------lidia 
10101010-----------------alex 
23232323-----------------matt 
98748484-----------------steve 

Я хочу, чтобы вернуться только:

person_number------------name 
============================== 
1234567------------------john 
00004567-----------------mark 
9999999------------------mike 
0009999------------------lidia 

Вы видите, я хочу, чтобы вернуть дубликаты, которые заканчиваются одинаковыми последними 4 цифрами, но я не имеют конкретных цифр, чтобы дать вы так не можете использовать что-то вроде «% 9999». Он также должен быть правильно отсортирован, поэтому я имею их рядом друг с другом. Мне нужно найти дубликаты и удалить один из них, но я не знаю, какой из них, пока я не увижу все другие значения в других столбцах и не выбираю, какой из них нужно удалить вручную.

Спасибо!

+0

сделать ROW_COUNT основанные на праве ([PersonNumber], 4) с RowNumber> 1 – lookslikeanevo

ответ

0

Я просто хочу продлить Sick ответ.

Вы говорите, что вам понравится, какой из них устранить. Но вы также можете включить клаузулус статусом CASE, чтобы отфильтровать тот, который вы хотите устранить.

В этом случае я заказываю "name", поэтому вы можете удалить все с помощью rn > 1 и сохранить свое имя.

SqlFiddleDemo

select "person_number", "name", rn, zero_count 
from 
(
    select "person_number", 
     "name", 
     substr("person_number", 1, 1), 
     count(1) over (partition by substr("person_number",-4)) as Cnt, 
     SUM(case 
      when substr("person_number", 1, 1) = '0' then 1 
      else 0 end) over (partition by substr("person_number",-4)) as zero_count, 
      row_number() over (partition by substr("person_number",-4) order by "name") as rn 
    from person 
) 
Where Cnt > 1 
and zero_count > 0 
ORDER BY substr("person_number",-4) 

я увеличить выборку данных

  • теперь включают в себя поле zero_count, чтобы вычислить, сколько строк начать с 0 в каждой группе
  • случай, когда оба ряда имеют то же самое 4 на конце и также начинаются с 0 (ZERO_COUNT = 2)
  • случай, когда строка без матча также начать с 0
+0

Это почти то, что мне нужно, но оно возвращает слишком много результатов, оно нуждается в сужении. Что нужно добавить в качестве условия, так это то, что одно из этих значений в столбце person_number начинается с 0. Итак: один начинается с нуля, но оба они имеют последние 4 цифры одинаково. например, 011112345 и 8888888882345. Кроме того, я хотел бы, чтобы это отображало все столбцы, поскольку эта таблица содержит около 50 разных столбцов, но это не мой приоритет, потому что я могу добавить столбцы в скрипт вручную. – Aleks

+0

@Aleks Это единственное дополнительное требование? Потому что я боюсь, что вы продолжите добавлять правила после каждой попытки. –

+0

Извините, Хуан, но я думаю, что это будет так. У меня есть повторяющиеся записи, где один начинается с 0, а другой - нет, поэтому я должен удалить одну из этих строк после того, как я посмотрю на них. Так что да, я думаю, что это будут только требования. – Aleks

3

Попробуйте

select person_number,name 
from 
(
    select person_number,name,count(1)over(partition by right(person_number,4)) as Cnt 
    from YourTable 
) 
Where Cnt > 1 
+0

'порядка по праву (person_number, 4)'. –