【问题标题】:Update first row with oldest, the next with second oldest, and so forth用最旧的更新第一行,用第二旧的更新下一行,依此类推
【发布时间】:2012-01-01 08:25:52
【问题描述】:

我在没有关系的 SQL Server 中编写更新时遇到问题。我浏览了整个论坛,但我很难找到答案。

如果客户金额匹配,我需要更新 OCR。问题是这不是唯一的密钥。因此,如果来自客户、金额组合的记录不止一条,我需要在查找表中获取最旧的匹配项并从中更新 OCR。然后我需要取第二旧的并用它的 OCR 更新第二行。

我尝试在下表中对其进行可视化。

欢迎所有建议!

要更新的表 - 更新前

Customer       OCR  Amount      
740000010417        220.000     
740000010417        220.000     
740000010421        300.000     
740000010421        250.000     

查找表

Customer         OCR            Amount  Date                    ID
740000010417    222357110626    220.000 2011-11-11 15:48:48.510 100642
740000010417    222350553822    220.000 2011-10-18 10:10:26.210 18680
740000010417    222350464525    220.000 2011-10-18 10:10:26.210 18681
740000010417    222357110725    220.000 2011-11-11 15:48:48.510 102547
740000010421    222357127726    250.000 2011-11-11 15:48:48.510 102548
740000010421    222357127725    220.000 2011-10-19 10:10:26.210 102549
740000010421    222357130555    250.000 2011-10-19 10:10:26.210 102550

更新后的表格

Customer            OCR          Amount     
740000010417    222350553822    220.000     
740000010417    222350464525    220.000     
740000010421                    300.000     
740000010421    222357130555    250.000 

【问题讨论】:

  • 不确定您是否可以在不使用某种形式的光标的情况下做到这一点,但我很高兴看到没有光标的解决方案!

标签: sql sql-server sql-update auto-increment


【解决方案1】:

这就是我最终得到的,就像一个魅力!谢谢佐海布!

UPDATE   t1
SET    t1.ocr = l1.ocr    
FROM    ( SELECT    *
              , rnk = ROW_NUMBER() OVER ( PARTITION BY t.customer,
                                          t.Amount ORDER BY t.customer, t.Amount )
           FROM      table t) t1
        LEFT JOIN 
    ( SELECT    *
              , rnk = ROW_NUMBER() OVER ( PARTITION BY l.customer,
                                          l.Amount ORDER BY l.date, l.id)
          FROM      lookuptable l) l1

      ON t1.id = l1.id
        AND t1.Amount = l1.amount
        AND t1.rnk = l1.rnk

【讨论】:

    【解决方案2】:
    update table set ocr = 
    
    (select l.ocr
    from 
    (select l.customer as customer, l.ocr as ocr, l.amount as amount, l.date as date, ROW_NUMBER() OVER (partition by l.customer, l.amount Order BY l.date) as RowNum
    from lookuptable l
    order by l.date
    )a
    
    (select t.customer as customer, t.amount as amount, ROW_NUMBER() OVER (PARTITION BY t.customer, t.amount order by t.customer) as RowNum
    from table t
    )b
    where a.customer = b.customer and a.amount=b.amount and a. rowNum = b.RowNum
    )
    

    我没有测试过,但它可能会给你一个想法。

    编辑: 刚刚意识到不需要加入内部查询。 想法是首先从查找表中选择所有记录,并按日期升序为其分配行号。 因此,相同的客户和不同日期的相同金额将在增量订单中获得行号。

    然后从旧表中获取记录,并按客户和金额为它们分配行号。这样我们可以匹配客户、金额和行号,因为第一个相同的客户和金额将被初始化为最旧的 OCR,因为行是按日期排序的

    【讨论】:

    • 嗨,还没有测试过,但看起来很有前途。您的编辑说明非常有用,我想我会弄清楚/将其应用到我的脚本中。谢谢!另一件事,我在一天前通过手机快速浏览了一下。然后还有另一个人的剧本。但现在它不见了,不知道它去了哪里。我会在一小时左右尝试查询。会让你知道。西亚
    • 第二个答案发生了什么?沃删了吗?有可能恢复吗?那里有一些有趣的代码?
    • @user641605 我不知道,但我想只有所有者才能删除它。
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2012-07-22
    • 2019-03-01
    相关资源
    最近更新 更多