使用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
感谢您的帮助!
答案 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