Sql 使用上面行中的数据更新每一行
我想用上一行的值更新表中的每一行,这取决于一些值 假设我的桌子是这样的:Sql 使用上面行中的数据更新每一行,sql,sql-server,Sql,Sql Server,我想用上一行的值更新表中的每一行,这取决于一些值 假设我的桌子是这样的: |storeID| Date | Stock | Medition | Regularized | -------------------------------- | 1 |2019-01-01| 500 | 550 | 1 | | 1 |2019-01-02| 500 | 0 | 0 |
|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 |
输出必须如下所示:
|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 |
当一家商店被正规化后,它的库存必须是第二天的药量。
有时会进行调整,但库存不需要调整。
我用递归表做了一些尝试,读了一些类似问题的帖子,但仍然无法解决我的问题
**想象一下,我有一个装满燃料的油箱。每天我都有销售和投入,油箱的库存也在变化。
任何一天我都可以做一个中介来检查真正的股票中介是否与我在股票书籍中写的股票匹配
如果它是不同的,我检查作为1最后一列正规化,股票第二天将是我做的媒介前一天。
如果我在最后一列中选择0,即使我做了调整,股票也将与前一天相同
感谢您为我提供的一切帮助。您只需使用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;
假设每个storeid只有一个正则化行
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
希望这能有所帮助为什么最后一行的股票价值是300而不是350?任何时候你尝试了一些东西,但它不起作用,发布你尝试了什么,以及结果出了什么问题。为什么你不能用滞后或超前函数来解决这个问题?为什么这个问题不应该作为你链接到的问题的副本关闭?最后一行有库存300,因为正则化列最后一天有0,所以库存没有被更改。所以更改是递归的,因为它需要使用第一行的存储ID值?@larnu似乎一开始就错误地写了1。我承认,我没有测试,但我不确定这是否有效。根据OP的最后一条评论,因为最后一行的股票价值为350,但应该是300。看起来这需要递归。:/经过测试,正如我所想,最后一行是错误的@Larnu,我没有看到正则化列发生了变化。我怀疑样本数据和预期结果之间存在一些问题。然而,我将删除这个答案,因为它并不能真正解决问题。我会等待进一步的澄清。是的,有点不对劲。第2行和第3行不正确,或者最后一行不正确。显然,我的解决方案是正确的,但示例数据不正确。我尝试过这个方法,问题是我得到了同一存储区中所有行的库存中的第一个介质。我想我没能解释我想要达到的目标。我编辑了我的帖子,试图澄清它。