在SQLite中,db是一个包含事件的表,可以及时记录对某个实体的更改。
这些实体中有数千个,其参数随时间而变化,因此在每次更改时我们都会记录变化的时间步长和整个参数设置。
例如
------------------------------------
| NodeId | tStep | Param1 | Param2 |
------------------------------------
| 1 | 92 | 90 | 20.8 |
| 5 | 92 | 101 | -2.4 |
| 5 | 108 | 38 | -3.6 |
------------------------------------
我需要在特定时间点检索实体的状态,例如tStep == 100
NodeId 1, Param1 == 90
NodeId 5, Param1 == 101
tStep == 110
NodeId 1, Param1 == 90
应该有NodeId 5, Param1 == 38
和Select
。
以下SELECT NodeId, tStep, Param1, Param2, MAX(tStep) FROM EventsTable
WHERE tStep <= ?
GROUP BY NodeId;
工作正常,但我需要优化数据库,以便尽快检索结果。
-------------------------------------------------
| NodeId | tStep | Param1 | Param2 | Max(TStep) |
-------------------------------------------------
| 1 | 92 | 90 | 20.8 | 92 |
| 5 | 108 | 90 | 0 | 108 |
-------------------------------------------------
唯一的限制是我不能为每个tstep设置实体状态,因为它会使db变得庞大。
我可以添加索引和其他帮助表。
预期(和有效)结果:
var list = json.Parse("type":"String","value":"Pre aprovado","valueInfo":{});
答案 0 :(得分:0)
您的查询有效,因为SQLite 发生以保证非标准行为并且不受任何其他数据库支持。此外,对于向查询添加min(tstep)
的人来说,有些祸了。我强烈建议不要依赖这个(误)功能。
你应该这样做:
select et.*
from eventstable et
where et.tstep < ?
order by et.tstep desc
limit 1;
对于此查询,您需要eventstable(tstep)
上的索引。
编辑:
如果您需要所有节点ID:
select et.*
from eventstable et
where et.tstep = (select max(et2.tstep)
from eventstable et2
where et2.nodeid = et.nodeid and et.tstep < ?
);
对于此版本,您需要eventstable(nodeid, tstep)
上的索引。