2013-03-20 59 views
0

我正在开发一个应用程序,以10秒为间隔从少量传感器中检索数据。这些值存储在一个单表sqlite数据库中。使用触发器维护每日最大值列表

这个应用程序的一个用例是打印读取的每个传感器的每日最大值。

我不喜欢在每次我想要检索这些值时发出类似于查询的MAX...GROUP BY day的想法,因此我想维护包含thos每日最大值的第二个表。

  1. 这是执行此类任务的适当方式吗?
  2. 我试着写这样一个触发器,但它没有工作。我莫名其妙地失踪已经在DB做中新值的比较在当前小时的能力,和值(这可能是没有价值的,如果一个新的小时刚刚开始)

    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 
    

回答

0
  1. 你说你更喜欢触发器;很难与此争论。 ;-)

    如果你想有一个技术上的原因:如果你这样做的最大的单日查询往往比一些新的值插入触发更有效。如果表中没有匹配值,则select lW...子查询返回一个NULL值。 与NULL任何比较将导致NULL,这使得CASE返回ELSE值,这是NULL。 您必须将子查询包装到IFNULL调用中。

  2. 您可以简化CASEMAX有两个参数:

    ... 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) 
          ) 
        ) 
    
+0

这正是我一直在寻找,我会测试,并接受你的答案 – Simbi 2013-03-20 12:11:54