我需要计算一列(Transparencia
)作为前一行的Dif
和Transparencia
值的总和。最初,只有第一行在 Account ------ Year_ ---- Month_ ---- Transparencia ---- Dif
--------------------------------------------------------------
'4030003'------ 2018 ---- 5 ---- 100 ---- -2
'4040001'------ 2018 ---- 5 ---- null ---- -4
'4040002'------ 2018 ---- 5 ---- null ---- 3
...
Account(N-1)------ 2018 ---- 5 ---- x ---- 8
Account(N)------ 2018 ---- 5 ---- x + 8 ---- 11
列中有一个值:
Account ------ Year_ ---- Month_ ---- Transparencia ---- Dif
--------------------------------------------------------------
'4030003'------ 2018 ---- 5 ---- 100 ---- -2
'4040001'------ 2018 ---- 5 ---- 98 ---- -4
'4040002'------ 2018 ---- 5 ---- 94 ---- 3
...
Account(N-1)------ 2018 ---- 5 ---- x ---- 8
Account(N)------ 2018 ---- 5 ---- x + 8 ---- 11
目的是获得以下内容:
Transparencia
其中:
Dif
加上上一行的Transparencia
)Dif
加上上一行的select
tmp.Account, tmp.Year_, tmp.Month_,Dif,
case
when Transparencia is null
then (lag(Transparencia, 1, 0) over (order by Account) -
lag(Dif, 1, 0) over (order by Account))
else Transparencia
end Transparencia
from
(select
Account,
nryear as Year_, nrperiod as Month_,
Dif, Transparencia
from
repaca
where
nrperiod = 5) tmp
)我尝试的解决方案是:
Account ------ Year_ ---- Month_ ---- Transparencia ---- Dif
'4030003'------ 2018 ---- 5 ---- 100 ---- -2
'4040001'------ 2018 ---- 5 ---- 98 ---- -4
'4040002'------ 2018 ---- 5 ---- null ---- 3
但是,这会返回以下结果:
SELECT
我需要使用{{1}}而不是存储过程或类似方法来实现此目的。任何帮助将不胜感激。
提前致谢
答案 0 :(得分:0)
你不想要lag()
。你想累积总和。由于值为NULL
,因此您可以使用max()
来简化获取第一个值的过程。所以:
select r.*,
(max(Transparencia) over () +
sum(diff) over (order by year, month)
) as new_Transparencia
from repaca r;
您也可以将其命名为:
select r.*,
sum(coalesce(Transparencia, 0) + diff) over (order by year, month) as new_Transparencia
from repaca r;
编辑:
以上使用的是错误的排序。这似乎是:
select r.*,
(max(Transparencia) over (partition by year, month) +
sum(diff) over (partition by year, month order by account)
) as new_Transparencia
from repaca r;