I have a tsql query like that:
DECLARE @TABLE TABLE(
    id int primary key identity(1,1),
    code int  );
INSERT INTO @TABLE VALUES (1),(NULL),(NULL),(NULL),(2),(NULL),(NULL),(NULL),(3),(NULL),(NULL),(NULL);
SELECT 
    id ,
    code
FROM @TABLE T1
My result :
id code 1 1 2 NULL 3 NULL 4 NULL 5 2 6 NULL 7 NULL 8 NULL 9 3 10 NULL 11 NULL 12 NULL
I want to change null value with null value’s last one numeric value. I want to see that:
1 1 2 1 3 1 4 1 5 2 6 2 7 2 8 2 9 3 10 3 11 3 12 3
But i dont want to use while loop. How can i do it ?
Advertisement
Answer
If the values are increasing, use a cumulative max:
select t.*,
       max(code) over (order by id) as imputed_code
from @table t;
If the code is not strictly increasing, then you can do this in two steps:
select t.*, max(code) over (order by grp) as imputed_code
from (select t.*,
             count(code) over (order by id) as grp
      from @table t
     ) t;
Given that this is a table variable, I’m guessing that you don’t really want to update it. But if you do:
with toupdate as (
      <one of the above queries>
     )
update toupdate
    set code = imputed_code
    where code is null;