我写的异常使用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?),但是它正在捕获重复的内容,而这两列都具有相同的值。我的要求是一列值相同,而第二列在一个月的日期范围内变化。
答案 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
)