我有传入的传感器数据存储在表格中。传感器的每个记录都有很少的“计数器”列。计数器只不过是时间的快照。示例记录如下所示。
|id | sensor | counter 1 | counter 2 | timestamp 1 5 100 200 10:00 AM 2 5 125 210 10:01 AM ... 60 5 1000 800 11:00 AM
我有数千个此类传感器及时发送其计数器值的快照。我需要做的是,假设上午10点到11点之间的时间段,将记录之间的 delta 映射到图表。达美总是被带到以前的记录 在连续记录之间获取delta的SQL查询是什么? 我的第二个问题是,什么是一个好的表设计来存储这种自我引用的数据。可能是一个链表,每条记录都指向前一条记录?
答案 0 :(得分:1)
通用SQL是:
select t.*,
(select counter1 from t t2 where t2.sensor = t.sensor and t2.timestamp < t.timestamp
order by timestamp desc
limit 1
) prevCounter1
from t
limit 1
取决于数据库。它可能是top 1
(SQL Server,Sybase)或where rownum = 1
(Oracle)。
您需要为每个计数器执行此操作。
如果您使用的是Postgres,Oracle或SQL Server 2012,则可以使用lag()
:
select t.*,
lag(counter1) over (partition by sensor order by timestamp) as prevCounter1
from t
在MySQL中,如果你输入prevID
,你将是最好的。如果没有,sensor, timestamp
上的索引应该给你合理的表现。