2013-01-23 2 views
1

이 쿼리를 수행하는 방법에 대해 완전히 혼란스러워합니다.그룹별로 조합 된 쿼리 업데이트 및 최소 날짜 설정

테이블에 수천 개의 행이있는 경우 성능에 큰 영향을 미치지 않고이 쿼리를 수행하는 방법은 무엇입니까?

제발 상담하십시오!

을 MyTable

pktimestmp | sw_id | url_id | open_date | end_date 
------------------------------------------------------- 
xxx0  | 101 | com | 2013-01-01 | 2013-01-30 
xxx1  | 202 | net | 2013-01-01 | 2013-01-30 
xxx2  | 202 | net | 2013-01-15 | 2013-02-28 * 
xxx3  | 303 | com | 2013-01-01 | 2013-01-30 
xxx4  | 303 | com | 2013-02-01 | 2013-02-15 * 
xxx5  | 303 | com | 2013-03-01 | 2013-03-15 * 
xxx6  | 404 | org | 2013-01-01 | 2013-01-30 
xxx7  | 404 | org | 2013-02-01 | 2013-02-15 * 
xxx8  | 404 | gov | 2013-02-01 | 2013-02-15 
xxx9  | 404 | gov | 2013-02-01 | 2013-02-15 

...

업데이트 쿼리에 : 소프트웨어 및 URL이 동일

날짜 (즉 sw_id 및 url_id).

opendate 및 enddate를 적은 (최소) 발생으로 설정했습니다.

xxx2  | 202 | net | 2013-01-15 | 2013-02-28 
will be 
xxx2  | 202 | net | 2013-01-01 | 2013-01-30 

here we have updated 
open_date to min(open_date) 
and 
end_date to min(end_date) 
from same sw and url. 

(우리는 단지 차이가있는 곳에 업데이트하면 좋을 것 예를 들어 그들은 "동일한"이기 때문에 xxx8 및 xxx9를 업데이트 할 필요가 없습니다에 대한)

을 MyTable (* = 업데이트 된 행)

pktimestmp | sw_id | url_id | open_date | end_date 
------------------------------------------------------- 
xxx0  | 101 | com | 2013-01-01 | 2013-01-30 
xxx1  | 202 | net | 2013-01-01 | 2013-01-30 
xxx2  | 202 | net | 2013-01-01 | 2013-01-30 * 
xxx3  | 303 | com | 2013-01-01 | 2013-01-30 
xxx4  | 303 | com | 2013-01-01 | 2013-01-30 * 
xxx5  | 303 | com | 2013-01-01 | 2013-01-30 * 
xxx6  | 404 | org | 2013-01-01 | 2013-01-30 
xxx7  | 404 | org | 2013-01-01 | 2013-01-30 * 
xxx8  | 404 | gov | 2013-02-01 | 2013-02-15 
xxx9  | 404 | gov | 2013-02-01 | 2013-02-15 

미리 감사드립니다.

+0

... 이봐, 행'xxx7'와 무슨 일이야? 종료일은 실제로 _ 증가합니다 ('과거'날짜까지, 그 이하). 그게'2013-02-15'일까요? –

+0

예 02-15 였으므로 수정되었습니다. 업데이트 쿼리에 대한 아이디어가 있습니까? : \ – MrSimpleMind

답변

1

(거의 모든 RDBMS에) 다음과 같은 작업을해야 ... :)

어떤 도움에 감사드립니다

, URL을, 힌트, 전자 책, 사이트 (그리고 더 난 더 다시 모델 권한 테이블이 없습니다) : 만 4 행이 업데이트로, 예상 생성

UPDATE MyTable as a SET (open_date, close_date) 
         = (SELECT MIN(open_date), MIN(close_date) 
          FROM MyTable as b 
          WHERE b.sw_id = a.sw_id 
          AND b.url_id = a.url_id) 
WHERE EXISTS (SELECT * 
       FROM MyTable as b 
       WHERE b.sw_id = a.sw_id 
       AND b.url_id = a.url_id 
       AND (b.open_date < a.open_date OR b.close_date < a.close_date)) 

는 (내 iSeries의 인스턴스에 대해 테스트) :

PKTIMESTAMP   SW_ID URL_ID OPEN_DATE CLOSE_DATE 
xxx0    101 com  2013-01-01 2013-01-30 
xxx1    202 net  2013-01-01 2013-01-30 
xxx2    202 net  2013-01-01 2013-01-30 
xxx3    303 com  2013-01-01 2013-01-30 
xxx4    303 com  2013-01-01 2013-01-30 
xxx5    303 com  2013-01-01 2013-01-30 
xxx6    404 org  2013-01-01 2013-01-30 
xxx7    404 org  2013-01-01 2013-01-30 
xxx8    404 gov  2013-02-01 2013-02-15 
xxx9    404 gov  2013-02-01 2013-02-15 
+0

Greatwork Clockwork-Muse, 나는 약간 자신을 시험해보고 그룹별로 해결책을 생각했습니다. 하지만 아마도이 솔루션이 최고일까요? 또는 더 빠르고 쉽게 다른 접근법이 있다고 생각하십니까 ... 고맙습니다! – MrSimpleMind

+0

당신 자신의 질문에 대답하는 것 (그리고 받아들이는 것)은 완벽합니다; 그러나 다른 사람들이 먼저 응답을 게시 할 시간을 허용하는 것이 좋은 형태로 간주됩니다. 솔루션을 가지고 있다면 게시하고, 우리는 그것을 살펴볼 수 있습니다. –

+0

감사합니다. 선택 쿼리를 작성하려고했습니다. 그룹별로 내가 무엇을 의미하는지 보여주기. 하지만 지금은 업데이트 쿼리를 사용합니다. 작업이 좋습니다! 선택 쿼리 (q1/q2)가 양호합니까? 내 게시물을 참조하십시오. 정말 고맙습니다!!! – MrSimpleMind

관련 문제