2011-11-18 55 views
1

我无法在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 
+0

不确定你可以做到这一点,而不诉诸某种形式的光标,但我很乐意看到没有一个的解决方案! – Bert

回答

1
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 
) 

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

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

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

+0

@ user641605是否按照你的要求工作? – Zohaib

+0

嗨,还没有测试过它,但它看起来非常有用。你的编辑笔记非常丰富,我想我会解决它/将它应用到我的脚本。谢谢!还有一件事,我前一天在手机上看了一眼。然后还有另一个人的剧本。但现在它消失了,不知道它已经走了。我会在一个小时左右尝试查询。会让你知道。 sia – user641605

+0

第二个答案发生了什么?禾删了吗?它是否可以恢复?那里有一些有趣的代码? – user641605

0

这就是我最终以这种方式工作的魅力!谢谢Zohaib!

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 
相关问题