Использование LAG - SQL Server 2014 - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно вычислить столбец (Transparencia) как сумму значений 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  

Где:

  • 98 = 100 + (-2) -> (Transparencia от предыдущего ряда плюс Dif от предыдущего ряда)
  • 94 = 98 + (-4) -> (Transparencia от предыдущегострока плюс Dif из предыдущего ряда)
  • x = 'Transparencia' из предыдущего ряда + 'Dif' из предыдущего ряда
  • x + 8 = 'Transparencia' из предыдущего ряда +8 («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 голосов
/ 01 июня 2018

Вы не хотите 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...