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와 비슷한 문제를 가지고 있습니다 ... 그들은 Microsoft와 관련이 있습니다, 그렇지 않습니까? – 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 

업데이트 시도하십시오.