3

我们有一个包含数百万条记录的数据库。它来自读取 0/1 的门传感器的时间戳数据。不是很复杂。

问题在于传感器也有“心跳”这一事实。它们输出它们所处状态的重复。这可以重复 1 到 n 次。

eg: 0101111101010000

我需要删除心跳并保持打开/关闭对。所以这个数据会变成:

010101010

我可以在 Matlab 中执行此操作(对于这种情况不实用),我可以在 Perl 中执行此操作。有没有办法通过查询(或查询)来做到这一点,这会比 Perl(或等效)更快吗?

编辑:更多细节:这是行数据。给定的行是“序列”、“传感器 ID”、“时间戳”、“代码”。正是这个“代码”值逐行重复。

4

2 回答 2

1

您可以做的是在 MySQL 中创建一个用户定义的函数,该函数循环,将字符串中的每个重复数字一次替换一个值(例如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
于 2012-07-11T17:55:15.147 回答
0

我敢肯定有一种更优雅的方式,但这是我的尝试

SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('0101111101010000', '111', '1'), '11', '1'),'11','1'),'000','0'),'00','0'),'00','0');
于 2012-07-11T18:24:03.523 回答