我们有一个有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/

10-11 03:32
查看更多