Эффективный запрос для поиска дубликатов записей - PullRequest
1 голос
/ 10 декабря 2010

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

Ответы [ 2 ]

2 голосов
/ 10 декабря 2010

Как правило, вы выполняете самостоятельное объединение с одной и той же таблицей и ставите свои «повторяющиеся» критерии в условия объединения.

Например,

SELECT
    *
FROM
    Transactions t1
        inner join
    Transactions t2
        on
            t1.Terminal = t2.Terminal and
            t1.Amount = t2.Amount and
            DATEDIFF(minute,t2.TransactionDate,t1.TransactionDate) between 0 and 10 and
            t1.TransactionID > t2.TransactionID /* prevent matching the same row */
2 голосов
/ 10 декабря 2010

Простой агрегат

SELECT
   col1, col2, col3, ...
FROM
   MyTable
GROUP BY
   col1, col2, col3, ...
HAVING
   COUNT(*) >= 2

Не включайте столбец идентификаторов / ключей / PK: он будет уникальным для каждой строки и портит агрегат.

Чтобы получить строку для удаленияили сохраните, сделайте MAX или MIN для этого

SELECT
   col1, col2, col3, ...,
   MAX(IDCol) AS RowToDelete,
   MIN(IDCol) AS RowToKeep
FROM
   MyTable
GROUP BY
   col1, col2, col3, ...
HAVING
   COUNT(*) >= 2

Конечно, с 3 дубликатами, затем выполните "keep".

Редактирование:

Для строк в пределахвременное окно, используйте функцию самостоятельного соединения или окно / рейтинг

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