[英]query to remove groups of duplicates
我們有一個擁有數百萬條記錄的數據庫。 它的門鎖傳感器的時間戳數據為0/1。 不是很復雜。
問題來自於傳感器也具有“心跳”的事實。 它們輸出它們所處的任何狀態的重復。這可以重復1到n次。
eg: 0101111101010000
我需要移除心跳並保持開/關對。 所以這些數據將成為:
010101010
我可以在Matlab中做到這一點(對於這種情況不實用),我可以在Perl中完成。 有沒有辦法通過查詢(或查詢)來完成它,這會比Perl(或等效的)更快嗎?
編輯:一些更具體的細節:這是行數據。 給定的行是“序列”,“傳感器ID”,“時間戳”,“代碼”。 這是“代碼”值,從行到行重復。
您可以做的是在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
我確信有更優雅的方式,但這是我的嘗試
SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('0101111101010000', '111', '1'), '11', '1'),'11','1'),'000','0'),'00','0'),'00','0');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.