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

Мой вопрос: действительно ли это плохой план / запрос? Можете ли вы объяснить план запроса? Должен ли я хранить один или оба среднего / уклона в таблице? Есть ли лучший способ сделать это?

0 ответов

Другие вопросы по тегам