SQLite Query скользящее среднее + наклоны
У меня есть таблица в SQLite, выгруженная из файла журнала CSV с 20-50 столбцами, до 500 тыс. Строк. Я хотел бы иметь возможность запрашивать различные столбцы несколькими способами: мгновенное значение, значение скользящего среднего и наклон. Я обдумывал добавление столбцов в таблицу для скользящих средних и уклонов, но я подумал, что сначала я должен исследовать метод запроса. Я нашел некоторую справку по скользящему среднему и справку по уклону от SO, которая заставила меня начать
Чтобы проверить, что я пытаюсь сделать, я создал следующий сценарий SQL:
DROP TABLE IF EXISTS TEST;
CREATE TABLE TEST (ID INTEGER UNIQUE PRIMARY KEY ASC, c1, c2);
INSERT INTO TEST (c1, c2) VALUES (1,5), (7,10), (11, 15), (5, 20), (8, 25), (10, 30), (12, 35), (15, 40), (18, 45), (20, 50);
--Create VIEW for Moving average (3 rows) of column c1
DROP VIEW IF EXISTS AVG_VIEW;
CREATE TEMP VIEW IF NOT EXISTS AVG_VIEW AS
SELECT * FROM TEST AS t,
(SELECT t1.ID, AVG(t2.c1) AS mavg
FROM TEST AS t1, TEST AS t2
WHERE t2.ID BETWEEN (t1.ID-2) AND t1.ID
GROUP BY t1.ID) sq
WHERE (t.ID = sq.ID);
--Create view for slope of 2 consecutive moving averages (just use dif for now)
DROP VIEW IF EXISTS SLOPE_VIEW;
CREATE TEMP VIEW IF NOT EXISTS SLOPE_VIEW AS
SELECT a1.*, (a1.mavg - a2.mavg) AS slope
FROM AVG_VIEW AS a1, AVG_VIEW AS a2
WHERE a2.ID = (a1.ID-1)
GROUP BY a1.ID;
SELECT * FROM SLOPE_VIEW;
Это дает ожидаемый результат:
ID c1 c2 ID:1 mavg slope
2 7 10 2 4 3
3 11 15 3 6.3333 2.333
4 5 20 4 7.6667 1.333
5 8 25 5 8 0.333
6 10 30 6 7.6667 -0.333
7 12 35 7 10 2.333
8 15 40 8 12.333 2.333
9 18 45 9 15 2.667
10 20 50 10 17.667 2.667
Я запустил "EXPLAIN QUERY PLAN" в операторе SELECT, но не смог понять, как его интерпретировать:
selectid order from detail
1 0 0 SCAN TABLE TEST AS t1 USING COVERING INDEX sqlite_autoindex_TEST_1
1 1 1 SEARCH TABLE TEST AS t2 USING INTEGER PRIMARY KEY (rowid>? AND rowid<?)
2 0 0 SCAN TABLE TEST AS t1 USING COVERING INDEX sqlite_autoindex_TEST_1
2 1 1 SEARCH TABLE TEST AS t2 USING INTEGER PRIMARY KEY (rowid>? AND rowid<?)
0 0 1 SCAN SUBQUERY 1 AS sq
0 1 0 SEARCH TABLE TEST AS t USING INTEGER PRIMARY KEY (rowid=?)
0 2 2 SEARCH TABLE TEST AS t USING INTEGER PRIMARY KEY (rowid=?)
0 0 0 EXECUTE LIST SUBQUERY 3
0 3 3 SEARCH SUBQUERY 2 AS sq USING AUTOMATIC COVERING INDEX (ID=?)
0 0 0 USE TEMP B-TREE FOR GROUP BY
Мой вопрос: действительно ли это плохой план / запрос? Можете ли вы объяснить план запроса? Должен ли я хранить один или оба среднего / уклона в таблице? Есть ли лучший способ сделать это?