如何在MySQL中加载数据,避免同一客户端相差5分钟的记录?(我可以在excel上轻松完成)



我需要在MySQL 8.0上插入数据,它有4列:

CLIENT_NUMBER VARCHAR(8)|SUBACCOUNT VARCHAR(2)|
DATE(DDMMYYYY)(VARCHAR(8))|TIME (HHMMSS)(VARCHAR(6))

要插入的txt文件示例:

46851254|1|27122021|12:34:45 (this row has to be inserted)
46851254|1|27122021|12:36:45 (this row has to be ignored because 120 seconds of difference)
46851254|3|27122021|12:38:45 (this row has to be inserted)
46851254|3|27122021|12:43:46 (this row has to be inserted because more than 500 seconds passed)
46851254|3|27122021|12:44:45 (this row has to be ignored because 59 seconds of difference)

清除txt文件:

46851254|1|27122021|12:34:45 
46851254|1|27122021|12:36:45
46851254|3|27122021|12:38:45
46851254|4|27122021|12:39:45
46851254|3|27122021|12:41:45

我需要避免在一个表上插入寄存器,该表具有相同客户端和相同子帐户的5分钟差异。我可以随心所欲地编辑表格。

我做不到,因为它不存在之类的东西

LOAD DATA INFILE IGNORE INTO TABLE transactions 
FIELDS TERMINATED BY '|' 
LINES TERMINATED BY 'n' 
(@col1,@col2,@col3,@col4) set client_number=@col1,
subaccount=@col2
date=@col3,
time=@col4 WHERE (DONT INSERT IF PREVIOUS row has same client and subaccount and difference time is less than 300 seconds )
;

或者它确实存在,但我不知道。

该表在任何列上都没有主键,对列进行索引只是为了更快地进行搜索。

起初我想把日期+时间转换成Epoch,看看差异是否小于300,但我只知道用Excel做这件事。在那里,我导入行并执行一个函数:;如果((A2=A1(AND(B2<500((";"复制记录";ELSE";"正确记录";在我之前制作行的位置:A: CONCAT(客户端编号和子帐户(B: (日期|时间-1970年1月1日00:00:00(*86400。然后我导入";行编号";然后该行号是我的选择*;不存在相差5分钟的寄存器。

如果你能帮我做逻辑表格,我很感激。我希望可以在进行加载数据的同时进行验证,但如果首先我必须插入原始行,然后处理它们并提取";不是重复的";。

这不是一个简单的"SQL行";。信息需要几个过程,并且必须使用";除法&征服;。

  1. Client number, Subaccount number,epoch(date&time)排序的文件
  2. 如果前一行匹配,则逐行搜索:
  • 第n行的客户端编号||第n行子账户等于第n+1行客户号||第n+1行子账户
  • (线n+1的历元时间-线n的历元时刻(<501

所有匹配的n行都必须具有row_id。

然后选择/标记适用于两个匹配项的行,并将它们插入表格中。

您可以运行:

UPDATE table1 
SET duplicated_lines = 1 
WHERE row_id IN (SELECT row_id 
FROM table2)

最后,您可以运行以下查询:

SELECT * 
FROM table1 
WHERE duplicated = 0

所有数据都有一列,用于标识寄存器是否重复。

最新更新