Получить накопленное значение из столбца - PullRequest
0 голосов
/ 29 июня 2019

Я написал код 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);

1 Ответ

1 голос
/ 29 июня 2019

Если вы используете современную версию 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...