您好,我是SQL的新手,并希望有人可以帮助我解决这个问题。我一直在这里和那里使用滞后函数但是想知道是否有办法重写它以使其成为一个和范围。因此,不是在前一个月,我想采取前12个月,并在每个时期将它们加在一起。我不想写12行滞后但是想知道是否有办法用更少的代码行来获得它。请注意,将存在空值,如果12条记录中的一条为null,则它应为null。
我知道你可以编写写子查询来做这件事,但是想知道这是否可行。任何帮助将非常感激。
答案 0 :(得分:1)
你想要"窗框"窗口功能的一部分。 12个月的平均值看起来像是:
select t.*,
sum(balance) over (order by period rows between 11 preceding and current row) as moving_sum_12
from t;
您可以在documentation中查看窗口框架。
如果您想要累积总和,可以完全忽略窗口框架。
我应该注意,您也可以使用lag()
执行此操作,但它要复杂得多:
select t.*,
(balance +
lag(balance, 1, 0) over (order by period) +
lag(balance, 2, 0) over (order by period) +
. . .
lag(balance, 11, 0) over (order by period) +
) as sum_1112
from t;
这使用了lag()
的鲜为人知的第三个参数,这是在记录不可用时使用的默认值。它取代了coalesce()
。
编辑:
如果您希望NULL
有12个值不可用,那么也可以使用case
和count()
:
select t.*,
(case when count(*) over (order by period rows between 11 preceding and current row) = 12
then sum(balance) over (order by period rows between 11 preceding and current row)
end) as moving_sum_12
from t;