在两个不同的列SQL采集重复记录

时间:2019-02-03 13:52:25

标签: mysql sql

我写的异常使用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"

在上面的例子中,项目足球开票两次 - 第一上2Jan并再次上5Jan。同样,橄榄球(Rugby)在1月7日,5月7日,10月10日计费三次。

我希望编写简单的SQL,可以提取每个项目(例如,使用distinct(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;

但是,这似乎效率很低,因为它长时间运行而不显示任何记录。 是否有可能获得一种更简单,更快速的方法?

我确实探索了现有主题(例如How do I find duplicates across multiple columns?),但是它正在捕获重复的内容,而这两列都具有相同的值。我的要求是一列值相同,而第二列在一个月的日期范围内变化。

2 个答案:

答案 0 :(得分:1)

您可以使用:

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)上建立索引。

答案 1 :(得分:0)

使用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
)