我已经写了一些查询来得到我的结果如下:注意:我有几个月从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(取决于季度的月份数)
我知道超前滞后功能,但我无法在这里应用它可以有人请帮忙
如果你将你的日期转换为季度,我可以用一组来完成这个问题:
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
确保你包括年份,你不想结合不同年份的季度。
好吧,正如其中一条评论中所说的那样。诀窍在于你的另一个问题和相应的答案。嗯......它有点像这样......
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