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

другое возможное решение без КТР:

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 ... Я просто хотел показать альтернативу ... может, у кого-то есть аналогичная проблема с dbms, которая не поддерживает CTE ... они специфичны для Microsoft, не так ли? – PrfctByDsgn

+0

Ну, вопрос был помечен тегом [tag: sql-server], поэтому, если есть требование предоставить агностический запрос базы данных (который, для чего-либо даже удаленно сложного, в любом случае невозможен), я не вижу проблема с проприетарными ответами - особенно когда, как я уже сказал, они представляют многоразовые и переносные шаблоны. –

0

Пожалуйста Попробуйте

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 

Обновление по вашему recuirnment.

Смежные вопросы