我编写了一个C代码,该代码从一个接口读取累积的字节,但是当该接口关闭时,它将重置并再次读取0,然后重新开始读取累积的数据。
我需要从sqlite3的此列中获取真实的累积数据。
例如,如果我具有以下值(表中的10行):
| 1 | 3 | 5 | 0 | 2 | 4 | 6 | 0 | N | 0 |
我只想对5、6和N求和,这是我的实际累积数据;值将立即出现在0条目之前。
有没有办法仅使用sqlite3函数,还是应该使用sqlite3_create_function(https://www.sqlite.org/c3ref/create_function.html)?如果创建函数是这样,我不知道在(* xStep)和(* xFinal)函数中该怎么做!
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE SIM_STATS (id INTEGER PRIMARY KEY AUTOINCREMENT, value INTEGER);
INSERT INTO "SIM_STATS" (value) VALUES(1);
INSERT INTO "SIM_STATS" (value) VALUES(3);
INSERT INTO "SIM_STATS" (value) VALUES(5);
INSERT INTO "SIM_STATS" (value) VALUES(0);
INSERT INTO "SIM_STATS" (value) VALUES(2);
INSERT INTO "SIM_STATS" (value) VALUES(4);
INSERT INTO "SIM_STATS" (value) VALUES(6);
INSERT INTO "SIM_STATS" (value) VALUES(0);
INSERT INTO "SIM_STATS" (value) VALUES(10);
INSERT INTO "SIM_STATS" (value) VALUES(0);
答案 0 :(得分:1)
如果使用现代版本的sqlite(3.25或更高版本;由于您使用的是C,并且可以直接在项目中直接包含sqlite源代码,因此很容易确保),使用lead()
窗口函数很容易。像这样:
SELECT sum(value)
FROM (SELECT value, lead(value, 1) OVER (ORDER BY id) AS next_val FROM sim_stats)
WHERE next_val = 0;
(OP编辑过的帖子使其无关紧要,但留给偶然发现它的人以供将来参考)
您确实需要一种指定行顺序的方法。否则,行将以任意顺序返回,该顺序可以不同于它们插入表的顺序,具体取决于精确的查询,所使用的索引,数据库配置等。请弄清楚(时间戳工作得很好,或者使用{{1} }整数主键),并用它代替AUTOINCREMENT
。