使用上一行的数据更新每一行

时间:2019-06-20 15:44:34

标签: sql sql-server

我想用上一行中的值更新表的每一行,具体取决于某些值。

比方说我的桌子是这样的:

  |storeID|   Date   | Stock  | Medition | Regularized |
    --------------------------------
    |   1   |2019-01-01|  500   |   550    |      1      |
    |   1   |2019-01-02|  500   |    0     |      0      |
    |   1   |2019-01-03|  500   |    0     |      0      |
    |   2   |2019-01-01|  250   |   300    |      1      |
    |   2   |2019-01-02|  250   |   350    |      0      |
    |   2   |2019-01-03|  250   |    0     |      0      |

输出必须如下所示:

|storeID|   Date   | Stock  | Medition | Regularized |
--------------------------------
|   1   |2019-01-01|  500   |   550    |      1      |
|   1   |2019-01-02|  550   |    0     |      0      |
|   1   |2019-01-03|  550   |    0     |      0      |
|   2   |2019-01-01|  250   |   300    |      1      |
|   2   |2019-01-02|  300   |   350    |      0      |
|   2   |2019-01-03|  300   |    0     |      0      |

商店正规化后,其库存量必须为第二天的药量。
有时已经服药了,但库存没有正规化。 我尝试使用递归表进行一些操作,并阅读了一些类似问题的帖子(Update record with previous row),但仍然无法解决我的问题。

**想象一下,我有一个装满燃料的油箱。每天我都有销售和投入,坦克的存量也在变化。 任何一天,我都可以进行服役以检查实际库存(服役)是否与我在“书籍”(库存)中写出的库存相匹配 如果不同,我将最后一列(常规化)作为1进行检查,则第二天的库存将是我前一天做的药物。 如果我在最后一列中将其设为0,则即使我服药了,库存也将与前一天相同。

感谢您能为我提供的所有帮助。

2 个答案:

答案 0 :(得分:1)

您可以只使用CROSS APPLY将表自身连接起来。

UPDATE st SET
    stock = u.Medition
FROM SomeTable st
CROSS APPLY( SELECT TOP 1 Medition 
            FROM SomeTable i
            WHERE i.storeID = st.storeID
            AND i.[Date] <= st.[Date]
            AND i.Regularized = 1
            ORDER BY [Date] DESC) u
WHERE st.Regularized = 0;

答案 1 :(得分:0)

假设每个商店ID仅存在一个正规化行

UPDATE INPUT_TABLE IT  
SET STOCK = ( SELECT MEDICATION FROM INPUT_TABLE ITI WHERE IT.STOREID = ITI.STOREID AND ITI.Regularized =1 )
WHERE IT.Regularized =0

希望这会有所帮助