2011-11-18 39 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 
相關問題