【问题标题】:oracle last_value function and forecastingoracle last_value 函数和预测
【发布时间】:2015-04-21 13:33:17
【问题描述】:

我需要从我的合同、项目表中返回一个包含最后日期的最后一个值的结果集;稍后我将需要使用此结果集来预测我预测的剩余月份的值。 我似乎一无所获,我需要记录最后一个日期、每个项目和合同的价值对并进行项目。 我只到了第一部分,即提取最后一个日期,值;第二部分也需要帮助,即获取此结果并进行投影。 我们开始:

我的桌子

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

非常感谢!

【问题讨论】:

    标签: sql oracle oracle11g forecasting


    【解决方案1】:

    这是您可能需要的查询:

    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
    

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


    如果我有更多的变量,如段、产品,查询将如何?

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

    但您可能希望像 valor 一样类比对待它们,这取决于您的需求。

    第二部分,需要将上个月的值再推算48个月(填写相同的值)

    为此,我们需要一些分层查询来生成新时期,这里我使用了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
    

    完美!效果很好!

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


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

    【讨论】:

    • 很高兴它有帮助。请阅读这篇短文article ;-)
    • 效果很好。如果我有更多的变量,如段、产品,查询将如何?第二部分,需要提前48个月预测上个月的值(填写相同的值)。非常感谢!
    猜你喜欢
    • 2021-03-18
    • 2021-02-28
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2019-02-16
    • 2017-07-31
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多