Какой хороший способ удалить дубликаты? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть колонка varchar.Содержит значения, разделенные точкой с запятой (;).

Например, это выглядит как

10; 20; 21; 17; 20; 21; 22;

Это не всегда 7 элементов.Он может содержать что-то от 30 до 70. Причина, по которой они разработали его таким образом, заключается в том, что значения на самом деле являются сегментами генома, и имеет смысл вводить или извлекать его коллективно

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

Мне также нужно удалить запись, если она содержит те же значения в другой записи.Например, мне нужно удалить

10 ;; 21; 17; 20; 21; 22;

, потому что он такой же, как первый, но неиметь второе значение 20. Если оно будет более полным, чем первое, вместо него я удалю первое.

1;2;3;4;5;6;7; и 1;2;3;4;5;6;7;8; - дураки, и я беру второй, потому что он более полный.1;2;3;4;5;6;;7 также является дубликатом.В этом случае, если у них есть 13 или более совпавших чисел и нет несоответствия, мы объединяем их, чтобы оно стало единым значением 1;2;3;4;5;6;7;7;.

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

Моя последняя цель - вычислить частоту появления этих чисел.Например, если число 10 появляется 5 из 100 раз, это будет 5%.Расчет будет простым.Тем не менее, я не могу рассчитать это, если я не убедился, что в таблице нет дубликатов.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

sql ниже является решением ТОЛЬКО ЕСЛИ:

  • 1; 2; 3; 4; 5;это более полная форма 1; 2 ;; 5
  • Все ваши записи заканчиваются на:

Запрос был протестирован с использованием sqlite, поэтому, возможно, для Oracle могут потребоваться некоторые изменения.

Ожидается таблица «ТЕСТ» со столбцом «ЗНАЧЕНИЕ»

SELECT 
    DISTINCT VALUE
from TEST As ORIGIN_TEST
WHERE NOT EXISTS (SELECT VALUE FROM TEST 
    WHERE 
        VALUE <> ORIGIN_TEST.VALUE AND
        (VALUE LIKE replace(ORIGIN_TEST.VALUE, ';;', ';_%;') OR
        VALUE LIKE ORIGIN_TEST.VALUE || '_%;')
)
0 голосов
/ 12 февраля 2019

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


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

delete from your_table y
where y.rowid not in ( select min(x.rowid)
                       from your_table x
                       group by x.genome_string)

Трудная часть заключается в создании дублирующих строк, которые имеют точные совпадения и нули.Объединение строк делает логику еще более запутанной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...