Oracle
 sql >> база данни >  >> RDS >> Oracle

Прогнозиране на данни от времеви редове в Oracle/SQL

Можете да създадете проста прогноза, като използвате REGR функции на линейна регресия.

--Ordinary least squares forecast for each customer for the next year.
select
    cust_id,
    max(year) +1 forecast_year,
    -- y = mx+b
    regr_slope(revenue, year)
        * (max(year) + 1)
        + regr_intercept(revenue, year) forecasted_revenue
from customer_data
group by cust_id;

CUST_ID   FORECAST_YEAR   FORECASTED_REVENUE
-------   -------------   ------------------
1                  2018               730868
2                  2018                50148
4                  2018                 7483
3                  2018                -9920

По-долу е примерната схема. Или можете да използвате този SQLFiddle .

create table customer_data
(
    cust_id number,
    year number,
    revenue number
);

insert into customer_data
select 1, 2016, 679862 from dual union all
select 1, 2017, 705365 from dual union all
select 2, 2016, 51074  from dual union all
select 2, 2017, 50611  from dual union all
select 3, 2016, 190706 from dual union all
select 3, 2017, 90393  from dual union all
select 4, 2016, 31649  from dual union all
select 4, 2017, 19566  from dual;

REGR функцията се занимава с двойки числа, тя не разбира бизнес правила като "приходите не могат да бъдат под 0". Ако искате да ограничите прогнозите винаги да остават на или над 0, CASE израз може да помогне:

--Forecasted revenue, with minimum forecast of 0.
select cust_id, forecast_year,
    case when forecasted_revenue < 0 then 0 else forecasted_revenue end forecasted_revenue
from
(
    --Ordinary least squares forecast for each customer for the next year.
    select
        cust_id,
        max(year) +1 forecast_year,
        -- y = mx+b
        regr_slope(revenue, year)
            * (max(year) + 1)
            + regr_intercept(revenue, year) forecasted_revenue
    from customer_data
    group by cust_id
);

CUST_ID   FORECAST_YEAR   FORECASTED_REVENUE
-------   -------------   ------------------
1                  2018               730868
2                  2018                50148
4                  2018                 7483
3                  2018                    0



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да потискам съобщението за успешно завършена PL/SQL процедура в sqlplus?

  2. Разлика в датата в Oracle и Java

  3. Oracle:10g oracle клиент работи ли с 11g сървър?

  4. Oracle/SQL - Намиране на записи с една стойност, с изключение на нули

  5. INSERT INTO SELECT FROM ACCESS TO ORACLE