如何在oracle中使用超前滞后功能

问题描述 投票:-1回答:2

我已经写了一些查询来得到我的结果如下:注意:我有几个月从2016年1月开始到1月201日。有两种类型,'hist'或'future'结果数据集:在这个例子中:让我们考虑将id1 + id2 + id3组合为1,2,3

type    month     id1  id2  id3    value
hist    jan-17     1    2   3       10
hist    feb-17     1    2   3       20
future  jan-17     1    2   3       15
future  feb-17     1    2   3       1
hist    mar-17     1    2   3       2
future  apr-17     1    2   3       5

我的计算逻辑取决于每月的季度数。例如。对于1月份(季度的第一个月),我希望价值为:1月的未来+非洲的未来价值+ 3月的未来价值。所以对于jan-17,输出应该是:15 + 1 + 0(对于3月没有相应的未来值)

对于feb月份(季度的第2个月),值应为:jan的hist + feb的未来+ march的未来,即10 + 1 + 0(3月的未来不可用)

同样对于行军月份,价值应该是:1月的历史+ 2月的历史+ 3月的未来,即10 + 20 + 0(游行的无广播)。

同样适用于4月,may.june(取决于季度的月份数)

我知道超前滞后功能,但我无法在这里应用它可以有人请帮忙

sql oracle
2个回答
0
投票

如果你将你的日期转换为季度,我可以用一组来完成这个问题:

WITH
    dset
    AS
        (SELECT DATE '2017-01-17' month, 5 VALUE
           FROM DUAL
         UNION ALL
         SELECT DATE '2017-02-17' month, 6 VALUE
           FROM DUAL
         UNION ALL
         SELECT DATE '2017-03-25' month, 7 VALUE
           FROM DUAL
         UNION ALL
         SELECT DATE '2017-05-25' month, 4 VALUE
           FROM DUAL)
  SELECT SUM (VALUE) value_sum, TO_CHAR (month, 'q') quarter, TO_CHAR (month, 'YYYY') year
    FROM dset
GROUP BY TO_CHAR (month, 'q'), TO_CHAR (month, 'YYYY');

这导致:

VALUE_SUM QUARTER YEAR
18        1       2017
 4        2       2017

如果您需要每条记录的结果,我们可以使用分析函数:

SELECT SUM (VALUE) OVER (PARTITION BY TO_CHAR (month, 'q'), TO_CHAR (month, 'YYYY')) quarter_sum, month, VALUE
  FROM dset

这导致:

QUARTER_SUM MONTH     VALUE
18          1/17/2017   5
18          2/17/2017   6
18          3/25/2017   7
 4          5/25/2017   4

确保你包括年份,你不想结合不同年份的季度。


0
投票

好吧,正如其中一条评论中所说的那样。诀窍在于你的另一个问题和相应的答案。嗯......它有点像这样......

with 
x as
    (select 'hist' type, To_Date('JAN-2017','MON-YYYY') ym , 10 value from dual union all
    select 'future' type, To_Date('JAN-2017','MON-YYYY'), 15 value from dual union all
    select 'future' type, To_Date('FEB-2017','MON-YYYY'), 1 value from dual),
y as
    (select * from x Pivot(Sum(Value) For Type in ('hist' as h,'future' as f))),
    /* Pivot for easy lag,lead query instead of working with rows..*/
z as
    (
        select ym,sum(h) H,sum(f) F from (
            Select y.ym,y.H,y.F from y
            union all
            select add_months(to_Date('01-JAN-2017','DD-MON-YYYY'),rownum-1) ym, 0 H, 0 F 
            from dual connect by rownum <=3 /* depends on how many months you are querying... 
            so this dual adds the corresponding missing 0 records...*/
        ) group by ym
    )
select 
ym,
Case
    When MOD(Extract(Month from YM),3) = 1
    Then F + Lead(F,1) Over(Order by ym) + Lead(F,2) Over(Order by ym)
    When MOD(Extract(Month from YM),3) = 2
    Then Lag(H,1) Over(Order by ym) + F + Lead(F,1) Over(Order by ym)
    When MOD(Extract(Month from YM),3) = 3
    Then Lag(H,2) Over(Order by ym) + Lag(H,1) Over(Order by ym) + F
End Required_Value
from z
© www.soinside.com 2019 - 2024. All rights reserved.