Вставка предыдущего ряда - PullRequest
       0

Вставка предыдущего ряда

0 голосов
/ 10 сентября 2018

У меня есть следующая таблица:

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)

enter image description here

Я хочу изменить таблицу, используя ' update ' следующим образом:

enter image description here

Я знаю о функциях «отставание» и «опережение». Но, как я понимаю, их нельзя использовать в UPDATE выражениях

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Microsoft SQL решение

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;

Скрипка: http://sqlfiddle.com/#!18/4922f/15

Пример: http://rextester.com/IKG65840

0 голосов
/ 11 сентября 2018

Вы также можете получить эти результаты с помощью рекурсивного CTE

Пример:

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;
0 голосов
/ 10 сентября 2018

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