1

我想根据最近的购买日期更新同一客户的邮政编码。更新重复记录

Customer_code  Postal_code last_purchase_date 
12345    444555  20130131 
12345    444555  20130131 
12345    123456  20110131 

由于第三场邮政编码是过时的,我想更新,并与最新的邮编是“444555”基于最新购买之日起代替它。因为我有几十万个类似这样的字段,对此有何建议?

回答

2
;WITH x AS 
(
    SELECT Customer_code, Postal_code, rn = ROW_NUMBER() OVER 
    (PARTITION BY Customer_code ORDER BY last_purchase_date DESC) 
    FROM dbo.some_table_name 
) 
UPDATE x SET x.Postal_code = y.Postal_code 
    FROM x INNER JOIN x AS y 
    ON x.Customer_code = y.Customer_code 
    WHERE y.rn = 1 AND x.rn > 1 
    AND COALESCE(x.Postal_code, '') <> y.Postal_code; 
+0

真的很感谢你的帮助亚伦!非常感谢!查询完美无缺:) – user3016727

0

没有CTE另一个可能的解决方案:

update tab 
    set postal_code = 
     (select top 1 postal_code from tab x where x.customer_code = t.customer_code order by last_purchase_date desc) 
    from tab t 
+0

CTE有什么问题?对于许多类似问题来说,这是一种非常可重复的模式,并非所有问题都可以通过排名前1的相关子查询解决。 –

+0

CTE没有什么问题......我只是想展示一个替代方案...也许有人对不支持CTE的dbms有类似的问题......他们是微软的具体,不是吗? – PrfctByDsgn

+0

嗯,这个问题被标记为[tag:sql-server],所以除非需要提供一个数据库不可知的查询(对于任何事情来说,即使是远程复杂的,也不可能),但我没有看到问题与专有答案 - 特别是当我说,他们提出可重复使用和便携式模式。 –

0

请尝试根据您的recuirnment它

WITH cte AS 
(
    SELECT *, rn = ROW_NUMBER() OVER 
    (PARTITION BY Postal_code ORDER BY Customer_code) 
    FROM dbo.some_table_name 
) 

update cte set last_purchase_date='' where rn = 2 

更新。