我们有一个拥有数百万条记录的数据库。它的门锁传感器的时间戳数据为0/1。不是很复杂。
问题来自于传感器也具有“心跳”的事实。它们输出它们所处的任何状态的重复。这可以重复1到n次。
eg: 0101111101010000
我需要移除心跳并保持开/关对。所以这些数据将成为:
010101010
我可以在Matlab中做到这一点(对于这种情况不实用),我可以在Perl中完成。有没有办法通过查询(或查询)来实现它,这会比Perl(或等效的)更快吗?
编辑:更具体一些:这是行数据。给定的行是“序列”,“传感器ID”,“时间戳”,“代码”。这是“代码”值,从行到行重复。
答案 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');