Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 使用触发器维护每日最大值列表_Sqlite_Triggers - Fatal编程技术网

Sqlite 使用触发器维护每日最大值列表

Sqlite 使用触发器维护每日最大值列表,sqlite,triggers,Sqlite,Triggers,我正在开发一个应用程序,在10秒内从少量传感器中检索数据。这些值存储在单表sqlite数据库中 此应用程序的一个用例是打印每个传感器的每日最大读数 我不喜欢每次我想检索这些值时都发出一个类似于MAX…GROUP BY day的查询,所以我想维护第二个包含这些每日最大值的表 这是执行此类任务的适当方式吗 我试着写了这样一个触发器,但没有成功。不知何故,我无法在新值和db中已存在的当前小时的值之间进行比较(如果新小时刚刚开始,则可能没有值) 你说你更喜欢扳机;这很难反驳 如果您想知道一个技术原因:

我正在开发一个应用程序,在10秒内从少量传感器中检索数据。这些值存储在单表sqlite数据库中

此应用程序的一个用例是打印每个传感器的每日最大读数

我不喜欢每次我想检索这些值时都发出一个类似于
MAX…GROUP BY day
的查询,所以我想维护第二个包含这些每日最大值的表

  • 这是执行此类任务的适当方式吗
  • 我试着写了这样一个触发器,但没有成功。不知何故,我无法在新值和db中已存在的当前小时的值之间进行比较(如果新小时刚刚开始,则可能没有值)

  • 你说你更喜欢扳机;这很难反驳

    如果您想知道一个技术原因:如果您执行每日最大查询的频率高于插入一些新值的频率,那么触发器的效率会更高

  • 如果表中没有匹配的值,则
    select lW…
    子查询返回
    NULL
    值。 与
    NULL
    进行任何比较都将导致
    NULL
    ,这使得
    案例
    返回
    其他
    值,即
    NULL
    。 您必须将子查询包装到调用中

  • 您可以使用两个参数将
    案例
    简化为
    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)
               )
        )
    

  • 这正是我想要的,我会测试它并接受你的答案
    ... 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)
               )
        )