0

少数のセンサーから10秒間隔でデータを取得するアプリケーションを開発しています。これらの値は、単一テーブルのsqliteデータベースに保存されます。

このアプリケーションの1つの使用例は、読み取られた各センサーの1日の最大値を印刷することです。

MAX...GROUP BY dayこれらの値を取得するたびにlikeクエリを発行するというアイデアは好きではないので、毎日の最大値を含む2番目のテーブルを維持することを考えました。

  1. これはそのようなタスクを実行するための適切な方法ですか?
  2. そのようなトリガーを書いてみましたが、うまくいきませんでした。新しい値と、すでにデータベースにある現在の時間の値を比較する機能がどういうわけか欠けています(新しい時間が始まったばかりの場合は値がない可能性があります)

    CREATE TRIGGER update_maxima AFTER  INSERT ON tick
    BEGIN
        INSERT OR REPLACE INTO maxima (time, device_id, lW) 
        VALUES (
            strftime('%Y-%m-%d 00:00:00', 'now') , 
            new.device_id,
            (select case when new.lW > (select lW from maxima where device_id = new.device_id AND time = strftime('%Y-%m-%d 00:00:00', 'now'))
                then 
                    new.lW
                else 
                    (select lW from maxima where device_id = new.device_id AND time = strftime('%Y-%m-%d 00:00:00', 'now'))
                end
            )
        );
    END
    
4

1 に答える 1

0
  1. あなたはトリガーがもっと好きだと言います。それについて議論するのは難しいです。;-)

    技術的な理由が必要な場合:新しい値が挿入されるよりも頻繁に1日あたりの最大数のクエリを実行すると、トリガーがより効率的になります。

  2. テーブルに一致する値がない場合、サブクエリは値を返しselect lW...ます。NULLと比較するNULLと、結果がになり、値NULLCASE返されます。サブクエリをIFNULL呼び出しにラップする必要があります。ELSENULL

  3. あなたは2つのパラメータであなたCASEを単純化することができます:MAX

    ... VALUES (
            strftime('%Y-%m-%d 00:00:00', 'now'),
            new.device_id,
            max(new.lW,
                ifnull((SELECT lW
                        FROM maxima
                        WHERE device_id = new.device_id
                          AND time = strftime('%Y-%m-%d 00:00:00', 'now')
                       ),
                       0)
               )
        )
    
于 2013-03-20T12:05:29.623 に答える