【问题标题】:Update every row with data from row above用上一行的数据更新每一行
【发布时间】:2019-06-20 15:44:34
【问题描述】:

我想用上面一行的值更新表格的每一行,这取决于一些值。

假设我的桌子是这样的:

  |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),但我仍然无法解决我的问题。

**想象一下我有一个装满燃料的油箱。每天我都有销售和投入,坦克的库存也在变化。 任何一天我都可以做一个冥想来检查真正的股票(冥想)是否与我在“书籍”(股票)中写的股票匹配 如果它不同并且我检查为最后一列(Regularized),那么第二天的库存将是我前一天所做的调整。 如果我最后一列检查为 0,即使我做了冥想,库存也将与前一天相同。

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

【问题讨论】:

  • 为什么stock 的最后一行的值为300 而不是350
  • 任何时候您尝试过某事但没有成功,请发布您尝试过的内容以及结果出了什么问题。为什么您无法使用 LAG 或 LEAD 功能解决此问题?为什么不应该将此问题作为您链接到的问题的副本关闭?
  • 最后一行有股票300,因为正则化列最后一天有0,所以股票没有被改变。
  • 所以更改是递归的,因为它需要使用第一行的值(对于该 storeID)?
  • @larnu 似乎错误地写在第一位

标签: sql sql-server


【解决方案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;

【讨论】:

  • 我没有测试过,我承认,但我不确定这是否可行。根据 OP 的最后一条评论,最后一行对于 Stock 的值为 350,但它应该是 300。看起来这需要递归。 :/ (经过测试,正如我所想,最后一行是错误的DB<>fiddle)
  • @Larnu 我没有看到Regularized 列发生了变化。我怀疑样本数据和预期结果之间存在一些问题。但是,我将删除此答案,因为它并不能真正解决问题。我会等待进一步的澄清。
  • 是的,出了点问题。第 2 行和第 3 行不正确,或者最后一行不正确。
  • 显然我的解决方案是正确的,但示例数据不正确。
  • 我已经尝试过了,问题是我在同一家商店的所有行中获得了库存中的第一个中介。我想我没有解释我想要达到的目标。我已经编辑了我的帖子以尝试澄清它。
【解决方案2】:

假设每个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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2017-02-12
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多