엑셀에서 받은 원본 데이터 관리 0 9 2,176

by ampwings [2016.12.05 12:51:39]


안녕하세요. 

데이터를 관리함에 있어서 비효율적인 부분들이 있는데 경험이 부족해서 전문가의 조언을 구하고자 합니다.

 

postgreSQL을 사용합니다.

지금의 상태는

최초 데이터는 엑셀파일로 받습니다. (수십만개의 리스트)

이 데이터에는 100개 안팍의 중복되는 partNum이 존재합니다.

(실제 사용되는 db에는 partNum이 P Key 로 되어 있기 때문에 등록이 안됩니다.) 그래서 중복값 제거를 위해

excel -> .csv 로 출력해서 임시테이블에 등록해서 중복데이터를 확인.

엑셀에서 확인된 데이터들을 정리합니다. 

정리된 원본 엑셀파일을 두개의 테이블로 나누어 등록해야 합니다. partNum을 외래키로 해서 ...  

테이블 1 : partNum, description, newP_Num

테이블 2 : partNum, cost, msrp

 

각각 .csv로 출력하고 

partNum 을 외래키로 연결되어 있는 테이블에 import 해서 등록합니다. 

 

이 중 가장 손이 많이 가는 부분은 중복데이터를 확인해서 엑셀에서 다시 정리해야 하는 부분입니다. 

 

효과적인 방법이 없을까요? 

by 마농 [2016.12.05 13:10:41]

중복 데이터를 확인한후 엑셀에서 지우시나요?
중복 데이터를 확인이 가능하다면?
중복 데이터를 삭제하는 방법이나
중복 데이터를 제외하고 1건만 조회하는 것도 가능할 것입니다.
삭제 또는 중복 제거하고 조회하는 Select 방법을 찾아보세요.
그런 뒤에 Insert Into ~ Select ~ 구문을 이용하시면 됩니다.


by ampwings [2016.12.05 14:12:28]

답변주셔서 감사합니다. 

중복데이터 검색할때 조건문을 이용해서 삭제할 목록만을 select한다면 그나마 엑셀에서 작업하기가 수훨할 것 같습니다.   

5개의 컬럼이 있는 테이블에 
no | partNum | description | newP_Num | cost 
SELECT * FROM CheckParts 
    WHERE partNum IN
    (
    SELECT partNum FROM CheckParts GROUP BY partNum HAVING COUNT(*)>1
    ) ORDER BY partNum, cost;

이처럼 중복 데이터를 정렬해서 조회는 했습니다. 

 

이때 삭제할 리스트 목록만을 출력하고 싶은데요. 

조건은 

중복되는 partNum 중에 newP_Num가 있는 경우 newP_Num이 없는 리스트를 출력

중복되는 partNum 중에 모두 newP_Num 이 없다면 cost 로 비교해서 낮은 값을 출력

중복되는 partNum 중에 이도저도 아니면 둘중 하나만 출력 

하려고 합니다.

sql 문에서 조건문을 낯설어서 열심히 검색중입니다. (db는 postgreSQL)

중복되는 리스트 중에 조건문을 달아야 하는데 어렵네요.. 


by 마농 [2016.12.05 14:27:00]

row_number 분석함수 사용 가능한가요?


by ampwings [2016.12.05 15:05:28]

row_number 은 아주 기본적인 것만 알고 있었고 써본적은 없었습니다.
조금만 더 힌트를 부탁드려요.


by 마농 [2016.12.05 15:07:05]
-- 임시테이블에서 중복제거한 목록을 바로 뽑아 입력하기 --
INSERT INTO 테이블1(partNum, description, newP_Num)
SELECT partNum, description, newP_Num
  FROM (SELECT no, partNum, description, newP_Num, cost
             , ROW_NUMBER() OVER(PARTITION BY partNum ORDER BY newP_Num, cost DESC, no) rn
          FROM CheckParts
        ) a
 WHERE rn = 1
;

INSERT INTO 테이블2(partNum, cost)
SELECT partNum, cost
  FROM (SELECT no, partNum, description, newP_Num, cost
             , ROW_NUMBER() OVER(PARTITION BY partNum ORDER BY newP_Num, cost DESC, no) rn
          FROM CheckParts
        ) a
 WHERE rn = 1
;

-- 임시테이블에서 중복 자료 삭제하기 --
DELETE FROM CheckParts
 WHERE no IN (SELECT no
                FROM (SELECT no
                           , ROW_NUMBER() OVER(PARTITION BY partNum ORDER BY newP_Num, cost DESC, no) rn
                        FROM CheckParts
                      ) a
               WHERE rn > 1
              )
;

 


by ampwings [2016.12.05 15:29:51]

마농님 ... 저는 단순히 삭제할 목록을 찾으려고만 했었는데 ... 

분석함수를 단순하게만 알고 있었고 인자로 여러개를 넣을 수 있다는 것도 알고는 있었지만 

이럴때 이렇게 사용하는건지는 전혀 몰랐습니다. 

다음번에는 저도 응용해서 사용할 수 있을 것 같아요. 

많이 배웠습니다. 감사합니다..!  


by ampwings [2016.12.05 17:17:22]

cost 가 NULL 인 경우 DESC 로 정렬을 하게 되면 NULL 이 상위로 올라와서 우선순위에 밀려서 값이 있는 데이터가 삭제 됩니다. 
DESC nulls last 를 적어서 해결했습니다. 


by 마농 [2016.12.05 18:26:01]

포스그레에서도 nulls last 가 되는 군요.

nulls last 가 안될 경우 NVL 처리 하셔도 됩니다.

오라클 NVL 함수가 포스그레 에서는 다를 수는 있겠죠.


by 손님 [2016.12.05 15:14:52]
그냥 로컬에 오라클 설치해서 테이블에 밀어넣은 담에 select 로 내려받는게 낫겠어요
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입