Скользящее среднее в sqlite - PullRequest
1 голос
/ 03 апреля 2020

Я хочу вычислить скользящее среднее в таблице и отслеживать время начала каждого вычисленного фрейма окна.

Моя проблема в том, что я ожидаю уменьшения количества результатов по сравнению со строками в таблице. Но мой запрос возвращает тот же номер строки. Я думаю, что понимаю, почему это не работает, но я не знаю, какое средство правовой защиты.

Допустим, у меня есть таблица с примерами данных, которая выглядит следующим образом:

+------+-------+
| Tick | Value |
+------+-------+
|    1 |     1 |
|    2 |     3 |_
|    3 |     5 |
|    4 |     7 |_
|    5 |     9 |
|    6 |    11 |_
|    7 |    13 |
|    8 |    15 |_
|    9 |    17 |
|   10 |    19 |_
+------+-------+

Я хочу вычислить среднее значение для каждого n-го элемента, например, из двух строк (см. отметки выше), чтобы получить результат:

+--------------+--------------+
| OccurredTick | ValueAverage |
+--------------+--------------+
|            1 |            2 |
|            3 |            6 |
|            5 |           10 |
|            7 |           14 |
|            9 |           18 |
+--------------+--------------+

Я пробовал это с

SELECT 
    FIRST_VALUE(Tick) OVER (
        ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
    ) OccurredTick,
    AVG(Value) OVER (
        ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
    ) ValueAverage 
FROM TableName;

Что Я получаю взамен это:

+--------------+--------------+
| OccurredTick | ValueAverage |
+--------------+--------------+
|            1 |            2 |
|            2 |            4 |
|            3 |            6 |
|            4 |            8 |
|            5 |           10 |
|            6 |           12 |
|            7 |           14 |
|            8 |           16 |
|            9 |           18 |
|           10 |           19 |
+--------------+--------------+

1 Ответ

1 голос
/ 03 апреля 2020

Вы можете использовать агрегацию. Если tick всегда увеличивается без пропусков:

select min(tick), avg(value) avg_value
from mytable
group by cast((tick - 1) / 2 as integer)

Вы можете изменить 2 на любой размер группы, который лучше всего подходит.

Если tick не увеличивается последовательно, мы может генерировать последовательность с row_number()

select min(tick), avg(value) avg_value
from (
    select t.*, row_number() over(order by tick) rn
    from mytable t
) t
group by cast((rn - 1) / 2 as integer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...