使用LAG - SQL Server 2014

时间:2018-06-01 00:41:51

标签: sql sql-server-2014 lag

我需要计算一列(Transparencia)作为前一行的DifTransparencia值的总和。最初,只有第一行在 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

其中:

  • 98 = 100 +( - 2) - > (前一行的Dif加上上一行的Transparencia
  • 94 = 98 +( - 4) - > (前一行的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
  • x =来自previos行的'Transparencia'+来自前一行的'Dif'
  • x + 8 =来自previos行的'Transparencia'+ 8(前一行的'Dif')

我尝试的解决方案是:

Account  ------ Year_ ---- Month_ ---- Transparencia ----  Dif 
'4030003'------ 2018 ----   5   ----     100       ----  -2  
'4040001'------ 2018 ----   5   ----      98       ----  -4  
'4040002'------ 2018 ----   5   ----    null       ----   3 

但是,这会返回以下结果:

SELECT

我需要使用{{1}}而不是存储过程或类似方法来实现此目的。任何帮助将不胜感激。

提前致谢

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;