3

何億ものレコードを持つデータベースがあります。0/1を読み取るドアセンサーからのタイムスタンプ付きデータ。それほど複雑ではありません。

この問題は、センサーにも「ハートビート」があるという事実に起因しています。それらは、どの状態にあるかに関係なく、繰り返しを出力します。これは、1〜n回のどこでも繰り返すことができます。

eg: 0101111101010000

ハートビートを削除し、オープン/クローズペアを維持する必要があります。したがって、このデータは次のようになります。

010101010

私はこれをMatlabで行うことができ(この状況では実用的ではありません)、Perlで行うことができます。1つまたは複数のクエリを介してそれを行う方法はありますか?これはPerl(または同等のもの)よりも高速ですか?

編集:いくつかの詳細:これは行データです。指定された行は、「シーケンス」、「センサーID」、「タイムスタンプ」、「コード」です。行から行へと繰り返されるのは、この「コード」値です。

4

2 に答える 2

1

できることは、MySQLでループするユーザー定義関数0000 -> 000 -> 00 -> 0を作成し、文字列内の重複する各数値を、数値が一意になるまで一度に1つの値(たとえば)で置き換えることです。

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 に答える