Sql 插入上一行

Sql 插入上一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下表: 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',

我有下表:

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)
我想使用“更新”更改表,如下所示:

我知道函数“滞后”和“超前”。但据我所知,它们不能用于更新表达式

这里有一个使用相关子查询的选项:

Microsoft SQL解决方案 小提琴:


示例:

您还可以通过递归CTE获得这些结果

例如:


我们可以问一下,为什么您有如此零碎的数据吗?如果没有将所有记录关联在一起的主/组列,则您请求的查询可能会非常繁重或费力。此数据是否已存在于表中?看起来你需要修复它,而不是事后更新,除非这是你在一次性工作中要做的。我知道函数“滞后”和“超前”。但是据我所知,它们不能用在更新表达式中,这不太正确,你可以,只是不能用在UPDATE子句本身。例如,您可以使用CTE。不过,滞后和领先对你没有帮助,这更接近于一个差距和孤岛问题。再加上其他人说的话——比如说,有人因为结婚需要更改姓氏。您将如何将其整合到这样的数据结构中?@Tibomso。更新不会更改表中的行数。你可能会考虑合并——你可以在更新中使用滞后和超前,但这似乎与你想要做的事情并不直接相关。
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;
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;
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;