Что лучший способ состоит в том, чтобы дедуплицировать таблицу?

Как предложил @ user45392, я бы проверил, действительно ли ответы «да» и «нет» закодированы как 1 и 0. В любом случае я бы предложил избегать сложной схемы «делать, если», которая может быть подвержена ошибкам и сложнее отлаживать. Например, вы можете создать VAS_USAGE следующим образом:

compute VAS_USAGE = 100*VAS1 + 10*VAS2 + VAS3.

Или, если вы хотите придерживаться определенных значений, которые вы указали в своем посте, добавьте это:

recode VAS_USAGE (111=1)(110=2)(101=3)(100=4)(1=5)(0=6).

Также, если вы просто хотите простой индекс от 1 до 8, вы можете сделать это:

compute VAS_USAGE = 4*VAS1 + 2*VAS2 + VAS3 + 1.
31
задан Brian Tompsett - 汤莱恩 22 May 2017 в 08:51
поделиться

6 ответов

delete from yourTable 
where Id not in (
    select min(id) 
    from yourTable
    group by <Unique Columns>
)

, где идентификатор - то, что Ваш уникальный идентификатор в таблице. (Мог быть customerNumber или безотносительно)

, Если у Вас нет Уникального идентификатора, можно добавить один (каждая таблица SQL должна уже иметь идентификатор, поскольку первый столбец, но

ALTER TABLE yourTable
ADD Id int identity(1,1)

Делают Ваш удалять (выше) и затем отбрасывают столбец.

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

0
ответ дан 27 November 2019 в 22:27
поделиться

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

Или наоборот, чтобы избавиться от строк ... просто удалите все строки, примите одну из всех групп.

0
ответ дан 27 November 2019 в 22:27
поделиться

Обмануть редко бывает просто. Это потому, что записи, которые нужно удалить, часто имеют немного разные значения в некоторых полях. Поэтому выбрать, какую запись сохранить, может быть проблематично. Кроме того, дубликаты часто являются записями людей, и трудно определить, являются ли эти два человека Джона Смита двумя людьми или одним человеком, который дублируется. Так что потратьте много (50% или более всего проекта) своего времени на определение того, что является дублированием и как обрабатывать различия и дочерние записи.

Как узнать, какое значение правильное? Дальнейшая дедупликация требует, чтобы вы обрабатывали все дочерние записи, не теряя ни одной. Что происходит, когда вы обнаруживаете, что, изменяя идентификатор в дочерней записи, вы внезапно нарушаете один из уникальных индексов или ограничений - в конечном итоге это произойдет, и вашему процессу необходимо это обработать. Если вы по глупости решили применить все свои ограничения только к приложению, вы можете даже не знать, что ограничения нарушены. Когда у вас есть 10 000 записей для дедупликации, вы не собираетесь выполнять дедупликацию через приложение по одной за раз. Если ограничения нет в базе данных, удачи в поддержании целостности данных при дедупликации.

Еще одна сложность заключается в том, что дубликаты не всегда точно совпадают по имени или адресу. Например, торговый представитель по имени Джоан Мартин может быть копией торгового представителя по имени Джоан Мартин-Джонс, особенно если у них одинаковый адрес и электронная почта. ИЛИ вы могли бы иметь в имени Джон или Джонни. Или тот же адрес, за исключением одной записи с сокращенным названием ST. и один прописал Street.В SQL-сервере вы можете использовать SSIS и нечеткую группировку, чтобы также определять близкие совпадения. Часто это самые распространенные дубли, так как факт отсутствия точных совпадений является причиной того, что они были введены как дубликаты.

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

8
ответ дан 27 November 2019 в 22:27
поделиться

Вы можете сгенерировать хэш для каждой строки (исключая PK), сохранить его в новом столбце (или, если вы не можете добавить новые столбцы, можете ли вы переместить таблицу в временная промежуточная область?), а затем поищите все остальные строки с таким же хешем. Конечно, вы должны быть в состоянии убедиться, что ваша хеш-функция не создает один и тот же код для разных строк.

Если две строки повторяются, имеет ли значение, от чего избавиться? Возможно ли, что другие данные зависят от обоих дубликатов? В таком случае вам нужно будет выполнить несколько шагов:

  • Найдите дубликатов
  • Выберите один из них как dupeA , чтобы удалить
  • Найти все данные, зависящие от dupeA
  • ] Измените эти данные, чтобы они ссылались на dupeB
  • , удалите dupeA .

Это может быть легко или сложно, в зависимости от вашей существующей модели данных.

Весь этот сценарий звучит как проект технического обслуживания и редизайна. Если так, удачи !!

0
ответ дан 27 November 2019 в 22:27
поделиться

Можно создать хэш для каждой строки (за исключением PK), сохранить его в новом столбце (или, если нельзя добавить новые столбцы, можно переместить таблицу во временную промежуточную область?), а затем искать все другие строки с таким же хэшем. Конечно, вы должны быть в состоянии убедиться, что ваша хеш-функция не создает один и тот же код для разных строк.

Если две строки дублируются, имеет ли значение, от чего вы избавляетесь? Возможно ли, что другие данные зависят от обоих дубликатов? В этом случае необходимо выполнить несколько шагов:

  • Найти дубликаты
  • Выберите один из них как дюпель A , чтобы исключить
  • Найти все данные, зависящие от дюпа A
  • Измените эти данные на дюпель B
  • удалить дубликат A .

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

Весь этот сценарий звучит как проект технического обслуживания и перепроектирования. Если да, то удачи!!

-121--1361206-
  • Единичный тест = наименьший гранулированный уровень.
  • Функциональный тест = средний модульный уровень.
  • Интеграционный тест = более высокий уровень приложения.
  • Заводские приемочные испытания = увидеть все работы
  • Приемочные испытания на сайте = увидеть все неудачи:)

Все вышеперечисленные полезны, но не являются взаимоисключающими. Вы должны делать большинство из них, но количество времени, которое вы тратите на каждую часть зависит от результатов, которые вы получаете от них, вот и все. Если код слишком модульен, чтобы его можно было легко протестировать, потратьте свои усилия на функциональные тесты. Если вы пишете библиотеку небольших компонентов, потратьте свое время на их модульные испытания, и если вы пишете системы управления для военных ракет, вы определенно должны быть на месте приемочных испытаний их (как взрывы, даже когда это не получается весело:))

-121--1403313-

Для SQL можно использовать таблицу INSERT IGNORE INTO SELECT xy FROM в unkeyed_table;

For алгоритма, если можно предположить, что ключи be-primary могут повторяться, но ключ to-be-primary однозначно идентифицирует содержимое строки, чем хэш только ключа be-primary и проверяет повторение.

0
ответ дан 27 November 2019 в 22:27
поделиться

Если вы отправляете внутренний опрос, который требует 100% участия сотрудников вашей компании, то лучшим маршрутом было бы просто иметь форму отслеживания ответчиков ID/Username/email и т.д. Каждые несколько дней или около того просто отправляйте приятное напоминание по электронной почте тем в вашей организации, чтобы завершить опрос... вы, вероятно, даже могли бы автоматизировать это.

-121--1155434-

Файл HTML будет дословно отображаться на странице PHP. Если пути на внешних ресурсах верны на основе URL-адреса страницы PHP, то они появятся.

-121--4690697-

SELECT DISTINCT < вставьте все столбцы, кроме PK здесь > FROM foo . Создайте временную таблицу с помощью этого запроса (синтаксис зависит от RDBMS, но обычно существует SELECT... INTO или CREATE TABLE AS ), затем выдувать старую таблицу и перекачивать в нее данные из временной таблицы.

13
ответ дан 27 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: