database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41509 게시물 읽기
No. 41509
조건에 따라 데이터 일정 간격으로 update 문의
작성자
rapid
작성일
2018-01-13 04:08:30ⓒ
2018-01-13 19:07:48ⓜ
조회수
895

안녕하세요. Oracle Query 작성하다가 난제에 부딪혀서 문의를 드리고자 합니다.

예전에 마농님을 비롯해서 여러 고수분들이 도움을 주셨었는데, 이번 문제는 답이 잘 안나오는군요. -_-;

 

1억 건 정도 데이터가 있는 테이블의 일부 row들에만 update를 하려고 하는데, 조건이 까다롭습니다.

 

한 방 쿼리로 업데이트 구문을 만들 수 있다면 좋겠지만,

여의치 않을 경우 임시 테이블을 이용하거나, function 을 이용하는 것도 괜찮을 듯 합니다.

 

 

 

* TBL_TOTAL_LIST 테이블 구성

 

pkid year company com_upt (업데이트할 대상 컬럼)

-----------------------------------------------------

aa 2017 A사

bb 2016 A사

cc 2017 A사

dd 2015 B사

ee 2008 A사

ff 2005 B사

gg 2008 C사

hh 2015 B사

ii 2009 A사

jj 2016 D사

kk 2011 E사

...

 

 

연도는 대략 2007년 부터 시작인데(10년치), 회사마다 시작연도가 다릅니다.

(회사는 모두 수 백개이며, 2015년부터 시작하는 회사도 있음)

 

각 회사마다 각 연도별로 균등하게.. 몇 row에 한 row씩 com_upt 컬럼에 company 값을 업데이트하는 것이 목표입니다.

 

예를들어, A사의 데이터가 2백만 건쯤 있고.. 1만 row 당 하나씩 com_upt = company 로 업데이트를 해야한다면,

연도별로 공평히 나눠서 업데이트를 하고 싶습니다.

즉, 총 200 row 를 업데이트 해야할텐데, 각 연도별로 균일하게 업데이트를 해야하니..

매년 20 row 정도씩이 업데이트 되어야하겠죠.

 

 

* TBL_TOTAL_LIST 테이블 업데이트 후 모습

 

pkid year company com_upt

---------------------------------

aa 2017 A사 A사

bb 2016 A사 A사

cc 2017 A사

dd 2015 B사 B사

ee 2008 A사 A사

ff 2005 B사

gg 2008 C사 C사

hh 2015 B사

ii 2009 A사 A사

jj 2016 D사 D사

kk 2011 E사 E사

...

 

 

 

여기서 어려운 점은.. N row에 한 row씩 업데이트를 해야하는데, 이 N 값이 정해져있지 않고..

각 회사가 최대 3,000건씩만 업데이트가 되어야 한다는 것입니다.

 

즉, 데이터가 많은 회사는 업데이트를 건너뛰는 데이터 간격이 넓을 것이고,

시작연도가 얼마 안된 회사는 비교적 촘촘히 업데이트가 되겠죠. (3,000건 보다 적은 회사는 없습니다)

 

예를들어 B사는 10년 동안 총 데이터가 6백만건이므로.. 대략 2천 row에 한 row씩 업데이트를 해야하고,

C사는 3년 동안 총 데이터가 90만건이므로.. 대략 3백 row에 한 row씩 업데이트를 해야합니다.

 

 

참고로 매년 생성된 데이터 수는 (회사에 상관없이) 비슷한 수치로 생성되었습니다.

중요한 것은 회사마다 3,000건만 균등한 간격으로 업데이트를 하면 됩니다.

 

 

 

mod 함수도 생각해봤고, rownum 가지고 해보려고도 했으나, 위 조건들이 복잡해서 잘 되질 않습니다.

(심지어는 UPDATE TBL_TOTAL_LIST SET COM_UPT = 'A사' WHERE PKID = 'aa'; 구문을 죽 나열해서

무식한 방법으로라도 작업하는 방법이라도..)

 

 

좋은 아이디어를 가지신 고수님들이 힌트를 주시길 기다리겠습니다.

감사합니다.

 

이 글에 대한 댓글이 총 1건 있습니다.

어차피 연도별로 균등하게 데이터가 입력된다면?
굳이 작업의 기준을 연도로 잡을 필요는 없어 보입니다.
그냥 회사별로만 간격기준을 다르게 하면 될 것 같네요.

UPDATE tbl_total_list
   SET com_upt = company
 WHERE ROWID IN (SELECT rid
                   FROM (SELECT ROWID rid
                              , company
                              , COUNT(*) OVER(PARTITION BY company) cnt
                              , ROW_NUMBER() OVER(PARTITION BY company
                                                  ORDER BY year, pkid) rn
                           FROM tbl_total_list
                         )
                  WHERE MOD(rn, FLOOR(cnt / 3000)) = 1
                 )
;

마농(manon94)님이 2018-01-15 11:49:52에 작성한 댓글입니다.
이 댓글은 2018-01-16 11:40:17에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
41513가로의 결과를 세로로 [2]
봉달이
2018-01-18
1078
41512characterset 다른 2개 서버로 클라이언트에서 접속 문의
개발자
2018-01-16
845
41511월별 주간별 row 구하기입니다. [2]
초보입니다.
2018-01-15
908
41509조건에 따라 데이터 일정 간격으로 update 문의 [1]
rapid
2018-01-13
895
41508임의로 row수 늘이기 [4]
초보입니다.
2018-01-11
973
41507컬럼을 일정 길이만큼 잘라서 구분자를 붙이기 [1]
선이
2018-01-10
851
41506해당 테이블 혹은 모든 테이블에서 자기자신 데이터의 1.5의 바이트가 현재 자신의 컬럼의 바이트 사이즈를 초과하는 컬럼 찾기 [5]
허광민
2018-01-03
923
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2018 DSN, All rights reserved.
작업시간: 0.074초, 이곳 서비스는
	PostgreSQL v10.4로 자료를 관리합니다