快速选择数据,而不会有其他行干扰%(mod)运算符

时间:2016-11-15 05:28:11

标签: sql select sqlite subquery

我有一个数据库将历史结果记录到文件中。

结果将记录到由

创建的表中
CREATE TABLE Data (TimeID INTEGER NOT NULL REFERENCES StartTimes, 
                   TimeOffset REAL,
                   SensorID INTEGER NOT NULL REFERENCES Sensors,
                   Value REAL);

我有一个索引(TimeID,TimeOffset)并且可以根据需要创建更多 - 我的INSERT性能暂时没问题,希望能保持这样。

我读取数据以使用

将数据放在图表上
SELECT SensorID, TimeOffset, Value from Data 
WHERE ((TimeID = %d AND TimeOffset BETWEEN %f AND %f) AND 
(%s));

其中%s被字符串替换为“(SensorID = 1和ROWID%5 = 0)或(SensorID = 2且ROWID%5000 = 0)”,%d是预准备语句中的常量值,%f必然与图表的限制相对应。

我的问题在于,如果我有两个传感器记录相同的速率,每个传输一个点,并且如果我的值使用模数变为例如2,然后我从一个传感器获得所有数据,而另一个传感器没有任何数据(我认为?)。

我尝试使用

SELECT COUNT(lesser.TimeOffset) as NewID, D.TimeOffset from Data as D
LEFT OUTER JOIN Data as lesser on D.rowid > lesser.rowid and D.TimeID=%d and D.SensorID=1
GROUP BY D.TimeOffset;

但在命令行上(使用TimeID的示例值)命令行处理了很长时间(可能我完全错误地写了语句)。

如何使用这些约束(TimeID = ?, TimeOffset BETWEEN?AND?)选择数据的子集,并快速通过SensorID获取不受其他测量写入影响的集合?

理想情况下,我希望能够使用MIN(x)和MAX(x)来查找给定TimeOffset范围内的最高值和最低值,但似乎我无法快速做到这一点(我可以解决 - 我是SQL(迭代)的新手。因此,我刚刚选择了%运算符。

编辑 - 示例表格内容:

SELECT * from Data LIMIT 10;

TimeID|TimeOffset|SensorID|Value
1|0.0|1|0.464069664478302
1|0.0|2|0.0
1|0.00100000004749745|2|0.00251327152363956
1|0.0020000000949949|2|0.00502652721479535
1|0.00300000002607703|2|0.00753975100815296
1|0.00400000018998981|2|0.010052926838398
1|0.00499999988824129|2|0.0125660402700305
1|0.00600000005215406|2|0.0150790736079216
1|0.00700000021606684|2|0.0175920110195875
1|0.00800000037997961|2|0.0201048385351896

使用我编制的数据(用于测试实现),我有一个介于0和1之间的随机数,传感器#1为1Hz,正弦波为#2,1kHz。 (这些不是一次写一个点,但我仍然觉得我可以使用rowid%x来摧毁自己的脚)

TimeOffset测量自数据采集开始以来的时间,而TimeID在StartTimes表中引用StartTime(YmDHMS等)。

理由

由于屏幕上的像素数通常远少于相关时间段内可用的点数,因此只选择一些点是合理的,可以减少我试图从数据库中读取的数据量。 / p>

使用%运算符可以给出均匀间隔的点,但在某些情况下很容易丢失数据的形状。

使用最小/最大抽取可以防止这种情况,但要使用它,您需要在每个时间跨度内找到对应于例如最小值和最大值的最小值和最大值。像素的宽度。如果我不在查询中执行此操作,那么我必须在图形的边界之间读取数据库中的所有数据,其中我可能只绘制一些小的(低于1%)分数。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用子查询计算数据采集系列中条目的索引,但这样会很慢。

过滤掉不需要的行的最有效方法可能是在您的程序中执行此操作,即以正确的顺序查询所有这些行,并且只是跳过所有这些行,除了每个 n 个。 (这需要排序,但ORDER BY TimeID, TimeOffset不需要任何费用,因为结果已经因索引而排序了。)

您可以使用covering index进一步改进查询,但对于此表格,clustered index(前三列中的PK)会更好。 另外,制作colunms TimeID, SensorID, TimeOffset的顺序,因为only the right-most used column in an index can optimize inequalities

相关问题