Как прогнозировать будущие значения с помощью линейной регрессии в SQL Server - PullRequest
0 голосов
/ 13 ноября 2018

Мой текущий запрос выглядит так:

select 
    b0 + x * b1 as trend,
    date 
from
    (select 
         (n * sumxy - (sumx * sumy)) / (n * sumxx - sumx2) as b1,
         (sumy * sumxx - sumx * sumxy) / (n * sumxx - sumx2) as b0,
         x,
         date
     from
         (select 
              sum(x) over() as sumx,
              sum(x) over() * sum(x) over() as sumx2,
              sum(y) over() as sumy,
              y,
              x,
              date,
              N,
              sum(xx) over() as sumxx,
              sum(x*y) over() as sumxy
          from
              (select 
                   utilization as y,
                   row_number() over(order by cryear, crmonth) as x,
                   row_number() over(order by cryear, crmonth) * row_number() over(order by cryear, crmonth) as xx,
                   datefromparts(cryear, crmonth, 1) as date,
                   count(crmonth) over() as N
               from
                   test) sub1
           group by 
               x, y, date, n, xx) sub2) sub3

, который возвращает следующие результаты: (координаты y и x линии тренда) edit: может дать разные значения тренда, потому что я только что составилзначения использования в фиктивной базе данных

trend               date
0.431791238486767   2017-01-01
0.430082148360641   2017-02-01
0.428373058234514   2017-03-01
0.426663968108388   2017-04-01

Необработанные данные в тестовой таблице выглядят следующим образом

cryear | crmonth | utilization value
2017   |   01    | 0,43
2017   |   02    | 0,45  
2017   |   03    | 0,52 
2017   |   04    | 0,48

и т. д.и т. д.


Я не знаю, способен ли созданный мной алгоритм прогнозировать значения тренда в течение месяцев, когда значение использования еще не известно.

Например, значение использования отсутствуетна 2017-05 гг. могу ли я как-то изменить скрипт для расчета значения тренда для него?Я на самом деле застрял и не могу придумать ничего полезного.

Пустая база:

create table test 
(
    CRYEAR      SMALLINT,
    CRMONTH     SMALLINT,
    UTILIZATION FLOAT(24)
);

Insert into test (cryear, crmonth, utilization) 
values ('2017', '01', '0.43'), ('2017', '02', '0.45'),
       ('2017', '03', '0.52'), ('2017', '04', '0.48');

Заранее спасибо и извините за длинный пост

...