안녕하세요. 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'; 구문을 죽 나열해서
무식한 방법으로라도 작업하는 방법이라도..)
좋은 아이디어를 가지신 고수님들이 힌트를 주시길 기다리겠습니다.
감사합니다.
|