복붙노트

[SQL] 중복 행을 제거 SQL 테이블에서 (여러 열에서 값을 기준으로)

SQL

중복 행을 제거 SQL 테이블에서 (여러 열에서 값을 기준으로)

나는 SQL 테이블을 다음 있습니다 :

AR_Customer_ShipTo

+--------------+------------+-------------------+------------+
| ARDivisionNo | CustomerNo |   CustomerName    | ShipToCode |
+--------------+------------+-------------------+------------+
|           00 | 1234567    | Test Customer     |          1 |
|           00 | 1234567    | Test Customer     |          2 |
|           00 | 1234567    | Test Customer     |          3 |
|           00 | ARACODE    | ARACODE Customer  |          1 |
|           00 | ARACODE    | ARACODE Customer  |          2 |
|           01 | CBE1EX     | Normal Customer   |          1 |
|           02 | ZOCDOC     | Normal Customer-2 |          1 |
+--------------+------------+-------------------+------------+

(ARDivisionNo, CustomerNo, ShipToCode)이 테이블에 대한 기본 키.

먼저 다른 ShipToCodes을 가지고 동일한 고객 (테스트 고객)에 속하는 3 개 행을 통지하는 경우 : 1, 2, 3과 유사하게 두 번째 고객 (ARACODE 고객)의 경우. 일반 고객 및 일반 고객이 각각 하나의 ShipToCode 만 한 기록을 가지고 있습니다.

지금, 나는 내가 고객 당 한 기록이있을 것이다이 테이블에 결과 쿼리를 좀하고 싶습니다. 그래서, 1 개 이상의 레코드가있는 고객을 위해, 나는 ShipToCode에 대한 가장 높은 값으로 기록을 유지하고 싶습니다.

나는 여러 가지 시도 :

(1) 나는 쉽게 테이블에 하나의 레코드 만 고객의 목록을 얻을 수 있습니다.

쿼리를 다음으로 (2), 나는 테이블에 하나 개 이상의 기록을 가지고있는 고객, 모두의 목록을 얻을 수 있어요.

[쿼리 1]

SELECT ARDivisionNo, CustomerNo
FROM AR_Customer_ShipTo 
GROUP BY ARDivisionNo, CustomerNo
HAVING COUNT(*) > 1;

(3) 이제, 위의 질의에 의해 반환 된 각 레코드에 대한 적절한 ShipToCode을 선택하기 위해, 나는 어떻게 반복 위의 질의에 의해 반환 된 모든 레코드를 통해 알아낼 수 없습니다입니다.

내가 좋아하는 뭔가를 할 경우 :

[쿼리 2]

SELECT TOP 1 ARDivisionNo, CustomerNo, CustomerName, ShipToCode  
FROM AR_Customer_ShipTo 
WHERE ARDivisionNo = '00' and CustomerNo = '1234567'
ORDER BY ShipToCode DESC

그럼 난 (00-1234567 테스트 고객)에 대한 적절한 기록을 얻을 수 있습니다. 나는 위의 쿼리 (질의 2)에 쿼리-1의 모든 결과를 사용할 수있는 경우에 따라서, 나는 더 이상의 레코드 고객의 원하는 하나의 기록을 얻을 수 있습니다. 이것은 원하는 최종 결과를 달성하는 점에서의 결과 (1)와 결합 될 수있다.

다시 말하지만, 이것은 내가 다음하고 접근보다 쉽게 ​​할 수 있습니다. 제가이 작업을 수행 할 수있는 방법을 알려 주시기 바랍니다.

[참고 :이 사용하는 SQL 만 조회 할 수 있습니다. 난 단지 쓰기 쿼리에 나를 수 '스크 인사이트'를 사용하여 마지막으로이 일을 실행하기 위하여려고하고 나는이 저장 프로 시저를 사용할 수 없습니다.]

해결법

  1. ==============================

    1.샘플 SQL 뿐인

    샘플 SQL 뿐인

    1) CTE를 사용 ARDivisionNo, CustomerNo에 따라 최대 선박 코드 값 기록을 얻을 수 있습니다 각 고객을위한

    WITH cte AS (
      SELECT*, 
         row_number() OVER(PARTITION BY ARDivisionNo, CustomerNo ORDER BY ShipToCode desc) AS [rn]
      FROM t
    )
    Select * from cte WHERE [rn] = 1
    

    2) 레코드 사용을 삭제하는 대신 선택의 질의 변화를 삭제하는 경우 RN에 절> 1. 샘플 SQL 뿐인

    WITH cte AS (
      SELECT*, 
         row_number() OVER(PARTITION BY ARDivisionNo, CustomerNo ORDER BY ShipToCode desc) AS [rn]
      FROM t
    )
    Delete from cte WHERE [rn] > 1;
    
    select * from t;
    
  2. ==============================

    2.ROW_NUMBER ()이 위해 중대하다 :

    ROW_NUMBER ()이 위해 중대하다 :

    ;WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY ARDivisionNo,CustomerNo ORDER BY ShipToCode DESC) AS RN 
                  FROM AR_Customer_ShipTo
                  )
    SELECT * 
    FROM  cte
    WHERE RN = 1
    

    당신은 당신이 간단하게 할 수있는 삭제하려는 경우, 중복을 제거 언급 :

    ;WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY ARDivisionNo,CustomerNo ORDER BY ShipToCode DESC) AS RN 
                  FROM AR_Customer_ShipTo
                  )
    DELETE cte
    WHERE RN > 1
    

    ROW_NUMBER () 함수는 각각 행 번호를 할당한다. 당신이 Some_Date BY PARTITION 다음 각각의 고유 한 날짜 값의 번호는 물론이고의 1. 주문에서 시작한다면 : 파티션 BY는 주어진 필드 또는 필드 그룹, 즉 각 값 이상의 번호 매기기 시작 옵션 만 사용되는 계수가 이동하는 방법을 정의하는 데 사용하고, ROW_NUMBER () 함수가 필요합니다.

  3. ==============================

    3.당신은 SQL 서버의 버전을 지정하지 않았지만, ROW_NUMBER 아마 지원됩니다

    당신은 SQL 서버의 버전을 지정하지 않았지만, ROW_NUMBER 아마 지원됩니다

    select *
    from
     (
      select ...
         ,row_number() 
          over (partition by ARDivisionNo, CustomerNo
                order by ShipToCode desc) as rn 
      from tab
     ) as dt
    where rn = 1
    
  4. ==============================

    4.ROW_NUMBER 기능 :

    ROW_NUMBER 기능 :

    SELECT * FROM(
                  SELECT ARDivisionNo, CustomerNo, CustomerName, ShipToCode,
                  row_number() over(partition by CustomerNo order by ShipToCode desc) rn
                  FROM AR_Customer_ShipTo) t
    WHERE rn = 1
    
  5. from https://stackoverflow.com/questions/30243945/removing-duplicate-rows-based-on-values-from-multiple-columns-from-sql-table by cc-by-sa and MIT license