簡體   English   中英

使用先前記錄中的數據更新SQL Server表記錄字段

[英]Update SQL Server table record field with data from previous record

我需要使用下面的第一條記錄中的前一個AFS_ToProduce值(ForecastID = 22)來更新第二條記錄AFS_OH列(ForecastID = 23)。 換句話說, AFS_OH = 307923的第二個記錄值AFS_OH = 307923

另外,我需要為整個表更新這些值,因此我的ForecastID編號將根據AFS_ToProduce < 0的標准而有所不同,正如您在下面的WHERE子句中所注意到的那樣。

我下面的腳本正在更新相同的記錄值,而不是下面的記錄。 謝謝你的幫助!

ForecastID        AFS_OH     AFS_ToProduce
22                307923    -307923
23                     0     316602

這是我的方法:

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

如果下一行具有正AFS_ToProduce,則以下更新會將AFS_ToProduce的負值傳輸到下一行。 如果不是,將忽略此行。 如果AFS_ToProduce為負,則內部select top 1將檢索上一行;否則,將返回上一行。 否則,將跳過fc_test中的當前行。 這允許在ForecastID中出現空白。

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

TEST在Sql Fiddle上

嘗試這個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM