我们有一个有100万条记录的数据库。它的时间戳数据来自读取0/1的门传感器。不是很复杂。
问题在于传感器也有一个“心跳”。它们输出它们所处的任何状态的重复。这可以在任何地方重复1到n次。
eg: 0101111101010000
我需要移除心跳并保持开/闭对。因此,这些数据将变成:
010101010
我可以在Matlab中完成(在这种情况下不实用),也可以在Perl中完成。有没有一种方法可以通过一个(或多个)查询来实现,这是否比Perl(或等效的)更快?
编辑:更多细节:这是行数据。给定的行是“序列”、“传感器ID”、“时间戳”、“代码”。是这个“代码”值在一行之间重复。
最佳答案
您可以在mysql中创建一个user-defined function循环,每次替换字符串中的每个重复数字一个值(例如0000 -> 000 -> 00 -> 0
),直到该数字唯一:
DELIMITER $$
CREATE FUNCTION removeDuplicates (str VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
DECLARE prevVal VARCHAR(255);
DECLARE curVal VARCHAR(255);
SET curVal = str;
REPEAT
SET prevVal = curVal;
SET curVal = REPLACE(REPLACE(prevVal, '11', '1'), '00', '0');
UNTIL prevVal = curVal
END REPEAT;
RETURN curVal;
END$$
DELIMITER ;
然后可以在查询中的任何位置使用此函数。例如:
SELECT removeDuplicates(your_column) FROM your_table
示例输出:
SELECT removeDuplicates('0101111101010000');
---> 010101010
SELECT removeDuplicates('011100000111100101010');
---> 01010101010
SELECT removeDuplicates('111010001011101110100010101');
---> 10101010101010101
SELECT removeDuplicates('111111111111111111111');
---> 1
SELECT removeDuplicates('000000000000000000000');
---> 0
SELECT removeDuplicates('11');
---> 1
SELECT removeDuplicates('00');
---> 0
SELECT removeDuplicates('1');
---> 1
SELECT removeDuplicates('0');
---> 0
关于mysql - 查询以删除重复的组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11438516/