我想根据最近的购买日期更新同一客户的邮政编码。更新重复记录
Customer_code Postal_code last_purchase_date
12345 444555 20130131
12345 444555 20130131
12345 123456 20110131
由于第三场邮政编码是过时的,我想更新,并与最新的邮编是“444555”基于最新购买之日起代替它。因为我有几十万个类似这样的字段,对此有何建议?
我想根据最近的购买日期更新同一客户的邮政编码。更新重复记录
Customer_code Postal_code last_purchase_date
12345 444555 20130131
12345 444555 20130131
12345 123456 20110131
由于第三场邮政编码是过时的,我想更新,并与最新的邮编是“444555”基于最新购买之日起代替它。因为我有几十万个类似这样的字段,对此有何建议?
;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;
没有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
CTE有什么问题?对于许多类似问题来说,这是一种非常可重复的模式,并非所有问题都可以通过排名前1的相关子查询解决。 –
CTE没有什么问题......我只是想展示一个替代方案...也许有人对不支持CTE的dbms有类似的问题......他们是微软的具体,不是吗? – PrfctByDsgn
嗯,这个问题被标记为[tag:sql-server],所以除非需要提供一个数据库不可知的查询(对于任何事情来说,即使是远程复杂的,也不可能),但我没有看到问题与专有答案 - 特别是当我说,他们提出可重复使用和便携式模式。 –
请尝试根据您的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
更新。
真的很感谢你的帮助亚伦!非常感谢!查询完美无缺:) – user3016727