首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用上一条记录中的数据更新SQL Server表记录字段

使用上一条记录中的数据更新SQL Server表记录字段
EN

Stack Overflow用户
提问于 2012-05-05 21:27:10
回答 2查看 2.4K关注 0票数 0

我需要用下面第一条记录中的前一个AFS_ToProduce值(ForecastID = 22)来更新第二条记录的AFS_OH列(ForecastID =23)。换句话说,AFS_OH = 307923的第二个记录值。

此外,我需要更新整个表的这些值,以便根据AFS_ToProduce < 0的条件,ForecastID数字会有所不同,正如您将在下面的WHERE子句中注意到的那样。

我下面的脚本正在更新相同的记录值,而不是下面的记录。谢谢你的帮忙!

代码语言:javascript
复制
ForecastID        AFS_OH     AFS_ToProduce
22                307923    -307923
23                     0     316602

以下是我的方法:

代码语言:javascript
复制
UPDATE FC_Test
SET AFS_OH = (AFS_ToProduce * (-1))
FROM FC_Test S3
INNER JOIN
(
    SELECT S1.FORECASTID, S2.AFS_ToProduce AS AFS_OH
    FROM FC_Test S1
    LEFT OUTER JOIN
    (
        SELECT *
        FROM FC_Test
    ) S2
    ON S1.ForecastID = S2.ForecastID
)S4 ON S3.ForecastID = S4.ForecastID
WHERE AFS_ToProduce < 0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-05 22:18:47

如果下一行有正的AFS_ToProduce,下面的更新将把负值AFS_ToProduce转移到下一行。如果不是,此行将被忽略。如果AFS_ToProduce为负,则内部select top 1将检索前一行;否则,将跳过fc_test中的当前行。这允许在ForecastID中存在间隙。

代码语言:javascript
复制
update fc_test
set AFS_OH = - fc2.AFS_ToProduce
from fc_test
cross apply
(
  select fc2.AFS_ToProduce
  from 
  (
    select top 1
        fc2.AFS_ToProduce
      from fc_test fc2
     where fc2.ForecastID < fc_test.ForecastID
     order by fc2.ForecastID desc
  ) fc2
  where fc2.AFS_ToProduce < 0
) fc2
where fc_test.AFS_ToProduce > 0

测试在Sql Fiddle上。

票数 1
EN

Stack Overflow用户

发布于 2012-05-05 22:02:10

尝尝这个

代码语言:javascript
复制
DECLARE @tbl table (i int, p int)

INSERT INTO @tbl (i,p) VALUES (1,1),(10,10),(11,11),(20,20)

SELECT * FROM @tbl

UPDATE t1
SET t1.p=t2.p
FROM @tbl t1
     CROSS JOIN @tbl t2
WHERE t2.i=(SELECT max(i)
               FROM @tbl t
               WHERE i<t1.i)


SELECT * FROM @tbl
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10462326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档