[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.샘플 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.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.당신은 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.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
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
'SQL' 카테고리의 다른 글
[SQL] 어떻게하는 SqlCommand에 설정된 격리 수준에 /도록 SqlConnection은, 트랜잭션 (transaction)로 초기화 (0) | 2020.06.11 |
---|---|
[SQL] 오라클 날짜 TO_CHAR ( '월 DD, YYYY')는 거기에 여분의 공백이 (0) | 2020.06.11 |
[SQL] 기본 개체에 뷰에 SELECT 권한을 부여,하지만 (0) | 2020.06.11 |
[SQL] COUNT (ID)의 MySQL의 대 수 (*) (0) | 2020.06.11 |
[SQL] 오라클 UNION 및 ORDER BY와 호기심 문제 (0) | 2020.06.10 |