我有一个中等大小的数据库(当时40万行)包含具有以下模式的测量表:sqlite3的如何计算差分改变
CREATE TABLE `Measurements` (
`timestamp` timestamp,
`timetick` INTEGER,
`Sensor1` REAL,
`Sensor2` REAL,
PRIMARY KEY(timestamp));
作为时间戳增加(时间戳增加不恒定有差距和延迟,但时间戳保证是单调的),通常时间戳也会增加,但在某些情况下,它会重置为一个小但不可预知的值。我需要找到所有这样的行。我用下面的查询(由Finding the difference in rows in query using SQLite启发):
select r0,r1,a,b,rd,d from
(select M0.rowid as r0,
M1.rowid as r1,
M0.timestamp as a,
M1.timestamp as b,
min(M1.timestamp)-M0.timestamp as rd,
M1.timetick-M0.timetick as d
from Measurements M0,Measurements M1
where M1.timestamp>M0.timestamp group by M0.timestamp
) where d<0;
这工作,但需要时间,而在30秒结束蟒同样的工作。然而,这是一个非常普遍的任务,科学家一直在计算衍生工具,而财务专业人员则计算价格差异。应该有一个有效的方法来做到这一点。
我会感谢您的帮助和意见。
显示[EXPLAIN QUERY PLAN](http://www.sqlite.org/eqp.html)的输出。 –
@cl 0 | 0 | 0 | SCAN TABLE测量AS M0使用索引sqlite_autoindex_Measurements_1(〜1000000行) 0 | 1 | 1 | SEARCH TABLE测量AS M1使用索引sqlite_autoindex_Measurements_1(timestamp>?)(〜250000 rows) – NameOfTheRose
SQL你可以使用'LAG'来查看以前的记录。但SQLite不具有这个分析功能。这意味着它无法在分类列表上工作并轻松比较相邻行。这是可能的,但会涉及具有较大中间结果的连接,因此对于DBMS来说是艰苦的工作。因此,您最好使用编程语言(如您已经注意到的)。 –