簡體   English   中英

查詢以刪除重復的組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM