2015-11-03 152 views
0

我需要帮助来尝试更新具有多个重复记录的表,但我被卡住了。只更新SQL Server中重复条目的第一条记录

我有这张表,我需要更新im_cust9alt_item_id1值。

我使用来从表中该结果的查询如下:

SELECT 
    o.item_id, o.alt_item_id1, o.im_cust9, o.owner_id, o.if_updatestamp 
FROM 
    item_master o 
INNER JOIN 
    (SELECT 
      alt_item_id1, COUNT(*) AS dupeCount 
     FROM 
      item_master 
     WHERE 
      owner_id = 'GIII' AND alt_item_id1 <> '' 
     GROUP BY 
      alt_item_id1 
     HAVING 
      COUNT(*) > 1) oc ON o.alt_item_id1 = oc.alt_item_id1 
WHERE 
    owner_id = 'GIII' AND o.alt_item_id1 <> '' 
ORDER BY 
    alt_item_id1, if_updatestamp ASC 

不知道如何更新每个组副本alt_item_id1的最古老的记录

我使用SQL Server 2012

enter image description here

任何帮助,不胜感激!

+0

所以你实际上并不具有重复行 - 只是alt_item_id1中相同owner_id的重复值,是否正确?你想更新im_cust9为那些具有相同的alt_item_id所有行最低if_updatestamp的item_id? – Jan

+0

@janschweizer正确! – user2797021

+0

[更新SQL Server表中所有除重复记录之一以外的所有记录](http://stackoverflow.com/questions/25090008/update-all-but-one-of-duplicate-records-in-table-in -sql-server) –

回答

0

要获取最新的行更新,请使用if_updatestamp的最大值。为最老的使用最小值。然后,它加入到你的表像这样的UDPATE ...

update IM 
Set IM.im_cust9 = NewDupeRow.alt_item_id1 
From item_master IM 
JOIN ( 
SELECT alt_item_id1,Max(if_updatestamp) MaxUpdateValue 
FROM item_master WHERE owner_id='GIII' AND alt_item_id1<>'' 
GROUP BY alt_item_id1) NewDupeRow 
On IM.alt_item_ID = NewDupeRow.alt_item_ID 
AND IM.if_updatedstamp = NewDupeRow.MaxUpdateValue 
+0

谢谢,这个解决了我的问题..! – user2797021

0

可以使用可更新的CTE和row_number()做到这一点:

with toupdate as (
     select i.*, 
      row_number() over (partition by alt_item_id order by if_updatestamp) as seqnum 
     from item_master i 
    ) 
update toupdate 
    set im_cust9 = alt_item_id1 
    where seqnum = 1; 
相关问题