c - 获取列的累计值

标签 c database sqlite

我编写了一个 C 代码,它从接口(interface)读取累积的字节,但是当该接口(interface)关闭时,它会重置,我再次读取 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);

最佳答案

如果使用现代版本的 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编辑了帖子以使其无关紧要,但将其保留以供任何偶然发现它的人将来引用)

您确实需要一种方法来指定行的顺序;如果没有,行将以任意顺序返回,该顺序可能与它们插入表中的顺序不同,具体取决于精确的查询、使用的索引、数据库配置等。弄清楚(时间戳工作良好,或者可能是 AUTOINCREMENT 整数主键)并用它代替 ordered_term .

关于c - 获取列的累计值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56813798/

相关文章:

c - 将 unsigned char * 转换为 int 的最佳方法?

database - 如何使用 svn 在 Maven 项目中实际使用 liquibase

c# - 检查是否有打开的数据库连接 asp.net/c#

mysql - 在 Mathematica 中使用 MySQL 数据库

sql - 将字符串与 SQLite3 中的数字进行比较

在此代码中工作的 C FILE fgets 函数

c - C编程-“else if”是否不同于“if”?

iphone - iOS 网络服务 xml 帮助

c - 如何使用 sscanf_s() 从文件路径中提取文件名?

android - Android中如何处理非常非常大的数据?