-- 处理IEMI重复的历史数据,建档日期(只有年月日)倒序,档案ID倒序,根据IMEI查档案,查询的结果,相同IMEI下的第一条记录的IEMI不处理,其他的记录的imei 改为空。
-- USE `testdb`;选择对应的数据库名称 -- 创建存储过程proc_UpdateIMEIUser /*判断是否存在,如果存在就删除*/ DROP PROCEDURE IF EXISTS `proc_UpdateIMEIUser`; DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `proc_UpdateIMEIUser`(IN valIMEI VARCHAR(100)) BEGIN DECLARE temNumber INT DEFAULT 0; DECLARE TempUserID INT; /*每条记录循环时的临时ID*/ DECLARE isDone INT DEFAULT 0; /*判断是否还有记录*/ DECLARE UpdateIMEICursor CURSOR FOR SELECT UserID FROM `sysUser` WHERE IMEI =valIMEI ORDER BY CreateDate DESC,UserID DESC;/*游标处理*/ DECLARE CONTINUE HANDLER FOR NOT FOUND SET isDone = 1;/*如果不存在就设置为1,即为true*/ OPEN UpdateIMEICursor; /*OPEN*/ REPEAT /*开始循环数据*/ FETCH UpdateIMEICursor INTO TempUserID; IF NOT isDone THEN IF temNumber > 0 THEN UPDATE sysUser SET IMEI='' WHERE UserID=TempUserID; END IF; SET temNumber=temNumber+1; END IF; UNTIL isDone END REPEAT; CLOSE UpdateIMEICursor;/*CLOSE,对应上面的open IMEICursor;*/ END $$ DELIMITER ; -- 创建存储过程 proc_IMEIUser /*判断是否存在,如果存在就删除*/ DROP PROCEDURE IF EXISTS `proc_IMEIUser`; DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `proc_IMEIUser`() BEGIN DECLARE valIMEI VARCHAR(100); /*每条记录循环时的临时IMEI*/ DECLARE isDone INT DEFAULT 0; /*判断是否还有记录*/ DECLARE IMEICursor CURSOR FOR SELECT IMEI FROM `sysUser` WHERE IsDel = 0 AND IMEI <>'' AND IMEI IS NOT NULL GROUP BY IMEI HAVING COUNT(*) > 1; DECLARE CONTINUE HANDLER FOR NOT FOUND SET isDone = 1;/*如果不存在就设置为1,即为true*/ OPEN IMEICursor; /*OPEN*/ REPEAT /*开始循环数据*/ FETCH IMEICursor INTO valIMEI; IF NOT isDone THEN CALL proc_UpdateIMEIUser(valIMEI); END IF; UNTIL isDone END REPEAT; CLOSE IMEICursor;/*CLOSE,对应上面的open IMEICursor;*/ END $$ DELIMITER ; -- 执行存储过程处理IMEI的重复数据 CALL proc_IMEIUser(); /*使用完毕后要删除存储过程*/ DROP PROCEDURE proc_UpdateIMEIUser; DROP PROCEDURE proc_IMEIUser;
注意:建档日期只有年月日, 而且有修改的入口,所以才先将建档日期倒序,档案ID倒序,最新的数据排在前面。
如果建档日期有年月日 时分秒,并且不能修改建档日期,那么可以去最大的档案ID就是最新的,可以直接写update脚本来处理,注意需要执行多次,如下:
UPDATE `sysUser` a,(SELECT MIN(UserID) AS UserID FROM `sysUser` WHERE IsDel = 0 AND IMEI IS NOT NULL AND IMEI <>'' GROUP BY IMEI HAVING COUNT(*) > 1) b SET a.IMEI ='' WHERE a.IsDel = 0 AND a.`UserID` = b.UserID;