oracle last_value 函数和预测

oracle last_value function and forecasting

我需要 return 一个结果集,其中包含我的合同、项目的最后日期的最后一个值 table;稍后我将需要使用此结果集来预测我预测的剩余月份的值。 我似乎没有任何进展,我需要获取每个项目和合同的最后日期、价值对并将其投影。 我只做了第一部分,即提取最后的日期、值;第二部分也需要帮助,即获取此结果并将其投射。 我们开始吧:

我的table

contrato,projeto,data,valor
C001    P1  01-APR-15   10
C001    P1  01-APR-15   10
C001    P1  01-MAY-15   15
C001    P2  01-MAY-15   19
C001    P2  01-JUN-15   21
C002    P1  01-JUL-15   19
C002    P2  01-AUG-15   19

我的查询

select CONTRATO,PROJETO,FCST,
LAST_VALUE("PERIODO" IGNORE NULLS)OVER (PARTITION BY contrato,projeto,FCST,periodo   ORDER BY contrato,projeto,FCST RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)LAST_DATE
from(
select CONTRATO,PROJETO,periodo,
  LAST_VALUE("VALOR" IGNORE NULLS)OVER (PARTITION BY contrato,projeto,periodo,valor ORDER BY PERIODO,contrato,projeto RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING )FCST
  FROM "HYP_STAGE"."INVENT_TABLE_FCST"
  )ORDER BY CONTRATO,PROJETO,PERIODO;

我的结果集,正在重复月份的值,每个月只需要一个值;

C001    P1  10  01-APR-15
C001    P1  10  01-APR-15
C001    P1  15  01-MAY-15
C001    P2  19  01-MAY-15
C001    P2  21  01-JUN-15
C002    P1  19  01-JUL-15
C002    P2  19  01-AUG-15

非常感谢!

这是您可能需要的查询:

SQLFiddle demo

select distinct contrato, projeto, 
    last_value(periodo) over (partition by contrato, projeto 
      order by periodo nulls first 
      rows between unbounded preceding and unbounded following) p,
    last_value(valor) over (partition by contrato, projeto 
      order by periodo nulls first 
      rows between unbounded preceding and unbounded following) v
  from INVENT_TABLE_FCST order by contrato, projeto

对于您关于未来期间预测结果的问题的第二部分,您没有解释预测结果的含义。


If i have more variables like segments, products how wpuld the query be?

我怀疑细分市场和产品的处理方式应与 contrato 和 projecto 相同,因此您需要将这些列添加到 select ... 部分和 partition by... 部分。

但你可能想像valor一样类比对待它们,这取决于你的需要。

Second part , need to project the last month value for another 48 months ahead(fill with the same value)

为此我们需要一些生成新周期的分层查询,这里我使用了 recursive CTE:

with data(n, contrato, projeto, periodo, valor) as (
  select distinct 1, contrato, projeto,
      last_value(periodo) over (partition by contrato, projeto
        order by periodo nulls first 
        rows between unbounded preceding and unbounded following) periodo,
      last_value(valor) over (partition by contrato, projeto
        order by periodo nulls first 
        rows between unbounded preceding and unbounded following) valor
    from INVENT_TABLE_FCST  
  union all
  select n+1, contrato, projeto, add_months(periodo, 1), valor
    from data where n<48 )
select contrato, projeto, periodo, valor 
  from data order by contrato, projeto, periodo

Perfect! It worked great!

那么为什么不将答案标记为已接受呢? ;-)


请注意:如果您的 table 中有任何主键,那就太好了,所以我们有不同的、递增的 确保分区和排序正确的值。