SQL查询:基于当前行修改下一行

时间:2018-01-12 15:40:04

标签: sql sql-server sql-server-2012

使用SQL Server 2012.

我正在使用的表格以及查询代码如下所示。当我发现ReasonString_S ='故障重置'我想将行DurationMinutes_D添加到下一行并删除当前行。

我认为当一个语句可以工作但我一直遇到语法问题并且我对sql查询相当新的时候会这样。

select ROW_NUMBER() OVER (ORDER BY EntryDate_T) AS Row, e.equip_name, 
ReasonString_S, DurationMinutes_D, rt.Name_S ProcStateString, EntryDate_T 
into #temptable
from AT_PM_PlantStateEvent pse
inner join EQUIPMENT e on pse.OwnerKey_I = e.equip_key
inner join dbo.AT_PM_ReasonTree rt on pse.ReasonKey_64 = rt.atr_key
where EntryDate_T >= @jobstart and EntryDate_T < @jobend
and rt.Name_S <> 'Running'
and e.equip_name = @mach

enter image description here

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

Row似乎是您的标识栏,如果没有,则不要犹豫是否要创建或使用其他现有列。它有许多好处,因为它在您的情况下非常有用,您只需使用JOIN,就可以执行所需的操作,如下所示:

create table #test(rowNum int identity(1,1), 
                   ReasonString_S varchar(50), 
                   DurationMinutes_D float)
insert into #test values
('Model1',0.34),
('Model2',0.35),
('Model3',0.36)

数据

rowNum  ReasonString_S  DurationMinutes_D
-----------------------------------------
1       Model1          0.34
2       Model2          0.35
3       Model3          0.36

update t set t.ReasonString_S = u.DurationMinutes_D
from #test t
left join #test u on u.rowNum = t.rowNum+1

<强>输出

rowNum  ReasonString_S  DurationMinutes_D
-----------------------------------------
1       0.35            0.34
2       0.36            0.35
3       NULL            0.36     

答案 1 :(得分:0)

这是一般答案。要根据下一行中的值更新行,应使用LEAD函数。首先,您需要确定要排序的列,以确定哪一行是下一行。 LEAD允许您从下一行获取特定列的值。如果使用LEAD函数编写子查询(只能出现在SELECT或ORDER BY子句中),则可以通过加入子查询来更新。

相反,要根据上一行中的值更新行,您需要使用LAG函数。

以下是一个例子:

declare @t1 table (id int, val varchar(10))

insert into @t1 values (1, 'val1')
insert into @t1 values (2, 'val2')
insert into @t1 values (3, 'val3')

update @t1 set val = sq.next_row_val
from @t1 t1
inner join (
    select t1.id, LEAD(t1.val) over (order by t1.id) as next_row_val
    from @t1 t1
)sq on t1.id = sq.id

select * from @t1

id  val
1   val2
2   val3
3   NULL