Как исправить SQL-запрос для скользящей средней, которая не считается точно - PullRequest
0 голосов
/ 17 января 2019

У меня есть таблица с неделей неделя число и среднее время время . Пример таблицы данных ниже.

CREATE TABLE my_table (
  `week` INTEGER,
  `time` INTEGER
);

INSERT INTO my_table
  (`week`, `time`)
VALUES
  ('14', '-249'),
  ('15', '-267'),
  ('16', '-254'),
  ('17', '-256'),
  ('18', '-254'),
  ('19', '-262'),
  ('20', '-265'),
  ('21', '-263'),
  ('22', '-258'),
  ('23', '-257'),
  ('24', '-269'),
  ('25', '-278'),
  ('26', '-278'),
  ('27', '-285');

Я запускаю следующий код, чтобы получить 4-недельное скользящее среднее на основе данных:

SELECT week, time, avg(time)
OVER (ORDER BY time ROWS BETWEEN 4 PRECEDING AND 0 FOLLOWING) AS moving_average
FROM my_table
ORDER BY week ASC

Что дает мне следующий вывод:

   week time moving_average   
    14  -249    -254
    15  -267    -275
    16  -254    -257
    17  -256    -259
    18  -254    -255
    19  -262    -265
    20  -265    -271
    21  -263    -268
    22  -258    -263
    23  -257    -261
    24  -269    -277
    25  -278    -281
    26  -278    -280
    27  -285    -285

Однако скользящая средняя не верна. Это должно выглядеть так:

Desired Results     
week    time    moving_average
14      -249    null
15      -267    null
16      -254    null
17      -256    -257
18      -254    -258
19      -262    -257
20      -265    -259
21      -263    -261
22      -258    -262
23      -257    -261
24      -269    -262
25      -278    -266
26      -278    -271
27      -285    -278

Можете ли вы предложить, как я могу пересмотреть свой SQL-запрос, чтобы получить точное скользящее среднее, как показано в Желаемых результатах?

1 Ответ

0 голосов
/ 17 января 2019

Нужно сделать заказ на неделю:

SELECT week, time,
       avg(time) OVER (ORDER BY week ROWS BETWEEN 4 PRECEDING AND 0 FOLLOWING) AS moving_average
FROM my_table
ORDER BY week ASC;

Это все еще не совсем то, что вы хотите, но это более очевидная проблема. Основываясь на ваших данных образца, я думаю, что вы хотите:

SELECT week, time,
       (case when row_number() over (order by week) >= 4
             then avg(time) over (order by week rows between 3 preceding and current row)
        end) as moving_average
FROM my_table
ORDER BY week ASC;

Обратите внимание, что вам, по-видимому, нужны предыдущие три недели и текущая строка для скользящей средней - немного нелогичного для "четырехнедельной" скользящей средней.

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