我想用上一行中的值更新表的每一行,具体取决于某些值。
比方说我的桌子是这样的:
|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,则即使我服药了,库存也将与前一天相同。
感谢您能为我提供的所有帮助。
答案 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
希望这会有所帮助