查询以删除重复的组

时间:2012-07-11 17:51:55

标签: mysql

我们有一个拥有数百万条记录的数据库。它的门锁传感器的时间戳数据为0/1。不是很复杂。

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

eg: 0101111101010000

我需要移除心跳并保持开/关对。所以这些数据将成为:

010101010

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

编辑:更具体一些:这是行数据。给定的行是“序列”,“传感器ID”,“时间戳”,“代码”。这是“代码”值,从行到行重复。

2 个答案:

答案 0 :(得分:1)

你可以做的是在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

答案 1 :(得分:0)

我确信有更优雅的方式,但这是我的尝试

SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('0101111101010000', '111', '1'), '11', '1'),'11','1'),'000','0'),'00','0'),'00','0');