【发布时间】:2018-10-08 14:59:29
【问题描述】:
我的数据子集如下所示:
create table tbl_1 as (
select * from (
select trunc(sysdate - (rownum - 1)) as call_dt,
rownum as calls,
to_char(trunc(sysdate - (rownum - 1)), 'DAY') as dow
from dual connect by rownum <= 22
)
where dow like '%MONDAY%'
order by call_dt
)
;
call_dt | calls | dow
-------------------------
17-SEP-18 22 MONDAY
24-SEP-18 15 MONDAY
01-OCT-18 8 MONDAY
08-OCT-18 1 MONDAY
然后我有另一个表格,其中包含如下所示的未来日期:
create table tbl_2 as (
select * from (
select trunc(sysdate + (rownum - 1)) as call_dt,
0 as calls,
to_char(trunc(sysdate + (rownum - 1)), 'DAY') as dow
from dual
connect by rownum <= 15
)
where dow like '%MONDAY%'
)
;
call_dt | calls | dow
-------------------------
15-OCT-18 0 MONDAY
22-OCT-18 0 MONDAY
我正在尝试获取我未来的日期,将它们附加到我的历史数据中,然后计算滚动加权平均值。我目前正在使用以下查询进行此操作。
select call_dt,
case when calls = 0 then (
(1 * lag1) + (0.8 * lag2) + (0.5 * lag3) + (0.3 * lag4))
else calls
end as calls,
dow
from (
select call_dt, calls, dow,
lag(calls, 4) OVER (partition by dow order by call_dt) as lag4,
lag(calls, 3) OVER (partition by dow order by call_dt) as lag3,
lag(calls, 2) OVER (partition by dow order by call_dt) as lag2,
lag(calls, 1) OVER (partition by dow order by call_dt) as lag1
from (
select * from tbl_1
union
select * from tbl_2
)
order by dow, call_dt
)
;
这会导致以下结果:
call_dt | calls | dow
-------------------------
17-SEP-18 22 MONDAY
24-SEP-18 15 MONDAY
01-OCT-18 8 MONDAY
08-OCT-18 1 MONDAY
15-OCT-18 46 MONDAY
22-OCT-18 24 MONDAY
这适用于一周中每一天的第一个未来日期。但是,对于后续日期,lag* 变量等于 0,因此值为 off。这是我希望实现的目标:
call_dt | calls | dow
-------------------------
17-SEP-18 22 MONDAY
24-SEP-18 15 MONDAY
01-OCT-18 8 MONDAY
08-OCT-18 1 MONDAY
15-OCT-18 46 MONDAY
22-OCT-18 70 MONDAY
我看了this question,好像它可以给我想要的东西?但是使用的窗口函数关键字对我来说是陌生的。我还查看了this tutorial,但这些滚动平均函数似乎假设非零条目。有没有可能达到这些结果?
【问题讨论】:
-
您使用的是什么版本的 Oracle?最简单的方法可能是递归 CTE。
-
你知道windowing_clause吗?也许像
RANGE BETWEEN INTERVAL '4' DAY PRECEDING AND INTERVAL '4' DAY FOLLOWING -
@GordonLinoff 我正在使用这个版本:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production -
@WernfriedDomscheit 我不熟悉 windowing_clause。您能否详细说明
BETWEEN INTERVAL '4' DAY PRECEDING AND INTERVAL '4' DAY FOLLOWING的工作原理?这是否会在 Oracle 正在运行的当前行的日期前后创建一个 +/- 4 天的窗口? -
是的,它就是这样工作的。 Oracle 在此示例中采用 +/- 4 天,无论此范围涵盖多少行。