SQL Capture дублирует записи в двух разных столбцах - PullRequest
0 голосов
/ 03 февраля 2019

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

Сведения об элементах вводятся в таблицу, которая имеет следующие два столбца (среди прочих).

ItemCode VARCHAR(50), BillEntryDate DATE

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

"Football","2019-01-02"
"Basketball","2019-01-02"
...
...
"Football","2019-01-05"
"Rugby","2019-01-05"
...
"Handball","2019-01-05"
"Rugby","2019-01-07"
"Rugby","2019-01-10"

В вышеприведенном примере пункт «Футбол» оплачивается дважды - сначала 2 января, а затем 5 января.Точно так же, пункт Rugby выставляется трижды на 5,7,10 января.

Я ищу написать простой SQL, который может забрать каждый элемент [скажем, с помощью отдельного предложения (ItemCode)], а затем отобразить все записи, которыедубликаты в течение 30 дней.В приведенном выше случае ожидаемый результат должен быть следующими 5 записями:

"Football","2019-01-02"
"Football","2019-01-05"
"Rugby","2019-01-05"
"Rugby","2019-01-07"
"Rugby","2019-01-10"

Я пытаюсь запустить следующий SQL:

select * from tablen a, tablen b, where a.ItemCode=b.ItemCode and a.BillEntryDate = b.BillEntryDate+30;

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

Я изучал существующие темы (например, Как найти дубликаты в нескольких столбцах? ), но он ловит дубликаты там, где ОБАстолбцы имеют одинаковое значение.Мое требование - один столбец с одинаковым значением, а второй столбец изменяется в диапазоне дат за месяц.

Ответы [ 2 ]

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

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

select t.*
from tablen t
where exists (select 1
              from tablen t2
              where t2.ItemCode = t.ItemCode and
                    t2.BillEntryDate <> t.BillEntryDate and
                    t2.BillEntryDate >= t1.BillEntryDate - interval 30 day and                    t2.BillEntryDate <= t1.BillEntryDate + interval 30 day 
             );

Это подберет оба дубликата в паре.

Для производительности вам нужен индекс на (ItemCode, BillEntryDate).

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

С EXISTS:

select ItemCode, BillEntryDate
from tablename t
where exists (
  select 1 from tablename 
  where 
    ItemCode = t.ItemCode  
    and 
    abs(datediff(BillEntryDate, t.BillEntryDate)) between 1 and 30
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...