PL SQL中是否有趋势线功能?

时间:2016-05-11 13:46:54

标签: sql oracle plsql

我需要一个函数来计算趋势线。我有一个查询(函数的一部分):

select round(sum(nvl(vl_indice, vl_meta))/12, 2) from (
SELECT 
  SUM (vl_indice) vl_indice, SUM (vl_meta) vl_meta
FROM
  (SELECT cd_mes, vl_indice, NULL vl_meta, dt.id_tempo,
    fi.id_multi_empresa, fi.id_setor, fi.id_indice
  FROM dbadw.fa_indice fi , dbadw.di_tempo dt ,
    dbadw.di_multi_empresa dme , dbaportal.organizacao o ,
    dbadw.di_indice di
  WHERE fi.id_tempo        = dt.id_tempo
  AND DT.CD_MES BETWEEN TO_NUMBER(TO_CHAR(ADD_MONTHS(TO_DATE(TO_CHAR(PCD_MES),'YYYYMM'),- 11),'YYYYMM'))
                          AND PCD_MES
       AND DT.ANO = TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(PCD_MES),'YYYYMM'),'YYYY'))
  AND fi.id_multi_empresa  = dme.id_multi_empresa
  AND dme.cd_multi_empresa = NVL(o.cd_multi_empresa_mv2000, o.cd_organizacao)
  AND o.cd_organizacao     = PCD_ORG
  AND fi.id_setor         IS NULL
  AND fi.id_indice         = di.id_indice
  AND di.cd_indice         = PCD_IVM
  UNION ALL
  SELECT cd_mes, NULL vl_indice, vl_meta, dt.id_tempo,
    fm.id_multi_empresa, fm.id_setor, fm.id_indice
  FROM dbadw.fa_meta_indice fm , dbadw.di_tempo dt ,
    dbadw.di_multi_empresa dme , dbaportal.organizacao o ,
    dbadw.di_indice di
  WHERE fm.id_tempo        = dt.id_tempo
  AND DT.ANO = TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(PCD_MES),'YYYYMM'),'YYYY'))
  AND fm.id_multi_empresa  = dme.id_multi_empresa
  AND dme.cd_multi_empresa = NVL(o.cd_multi_empresa_mv2000, o.cd_organizacao)
  AND o.cd_organizacao     = PCD_ORG
  AND fm.id_setor         IS NULL
  AND fm.id_indice         = di.id_indice
  AND di.cd_indice         = PCD_IVM
  )
GROUP BY cd_mes, id_tempo, id_multi_empresa, id_setor, id_indice
ORDER BY cd_mes);

我试图计算第一行的趋势线,但不正确。拜托,有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:3)

很难从查询中找出你想要适应的趋势线" to - 我认为你的意思是使用最小二乘线性回归来找到最适合数据。

这是测试数据的一个例子:

Oracle安装程序

CREATE TABLE data ( x, y ) AS
SELECT LEVEL,
       230 + DBMS_RANDOM.VALUE(-5,5) - 3.14159 * DBMS_RANDOM.VALUE( 0.95, 1.05 ) * LEVEL
FROM   DUAL
CONNECT BY LEVEL <= 1000;

正如您所看到的,数据是随机的,但大约是y = -3.14159x + 230

查询 - 获取最小二乘回归y轴截距和渐变

SELECT REGR_INTERCEPT( y, x ) AS best_fit_y_intercept,
       REGR_SLOPE( y, x ) AS best_fit_gradient
FROM   data

这将是:

best_fit_y_intercept best_fit_gradient
-------------------- -----------------
230.531799878168     -3.143190435415

查询 - 获取最佳拟合线的y坐标

SELECT x,
       y,
       REGR_INTERCEPT( y, x ) OVER () + x * REGR_SLOPE( y, x ) OVER () AS best_fit_y
FROM   data

答案 1 :(得分:0)

解决方案是:

SELECT valor, mes, 
((mes * SLOPE) + INTERCEPT) TENDENCIA, SLOPE, INTERCEPT from
( select valor, mes, ROUND(REGR_SLOPE(valor,mes) over (partition by id_multi_empresa),4)SLOPE, 
ROUND(REGR_INTERCEPT(valor,mes) over (PARTITION by id_multi_empresa),4) INTERCEPT from( --the initial select