Reputation: 373
I have the following table:
DECLARE @TempTable TABLE
(
ID int,
Lastname nvarchar(50),
Firstname nvarchar(50),
Age int
)
insert into @TempTable (ID, Lastname, Firstname, Age)
VALUES(1, 'Smith', NULL, NULL),
(2, NULL, 'Will', 40),
(3, NULL, 'Jaden', 20),
(4, 'Matt', NULL, NULL),
(5, NULL, 'Damon', 39)
I want to change the table using 'update' as follows:
I know about the functions 'lag' and 'lead'. But as I understand they can not be used in UPDATE expressions
Upvotes: 3
Views: 102
Reputation: 29647
You can also get those results via a Recursive CTE
Example:
DECLARE @TempTable TABLE
(
ID int,
Lastname nvarchar(50),
Firstname nvarchar(50),
Age int
)
insert into @TempTable (ID, Lastname, Firstname, Age) values
(1, 'Smith', NULL, NULL),
(2, NULL, 'Will', 40),
(3, NULL, 'Jaden', 20),
(4, 'Matt', NULL, NULL),
(5, NULL, 'Damon', 39);
;with RCTE AS
(
select ID, LastName, ID AS [NewID], LastName as NewLastName
from @TempTable
where LastName IS NULL
union all
select r.ID, r.LastName, t.ID, t.LastName
from RCTE r
join @TempTable t on t.ID = r.[NewID] - 1
where r.NewLastName is null
)
update t
set LastName = RCTE.NewLastName
from @TempTable t
join RCTE on (RCTE.ID = t.ID and RCTE.NewLastName IS NOT NULL);
delete
from @TempTable
where FirstName is null;
select *
from @TempTable
order by ID;
Upvotes: 0
Reputation: 25727
select id ,
(
select Lastname from @TempTable c where c.ID < p.id AND c.Lastname is not null group by Lastname
order by max(id) desc OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
) as Lastname,
FirstName,
Age
from @TempTable p
where Firstname is not null;
Fiddle: http://sqlfiddle.com/#!18/4922f/15
Example: http://rextester.com/IKG65840
Upvotes: 2
Reputation: 62831
Here's one option using a correlated subquery
:
update t
set lastname = (select top 1 lastname
from @TempTable t2
where t2.lastname is not null and
t.id > t2.id
order by t2.lastname)
from @TempTable t
where firstname is not null;
delete from @TempTable
where firstname is null;
select * from @TempTable;
Upvotes: 1