오라클 쿼리 질문입니다. 꼭 봐주세요~~ 0 7 3,538

by 손님 [SQL Query] 오라클 sql 쿼리 quary [2009.12.06 11:13:53]


안녕하세요.

현재 오라클을 이용하여 프로그램을 만들고 있는 개발자 입니다.

쿼리를 만들어야 하는데.. 도저히 답이 나오질 않아서.. 이렇게 질문을 올립니다.

DB에는..

shp = 번호, stdt = 시작일, fidt = 종료일, quay = 위치, pnt = 이벤트코드

===============================================================

(string)                (date)                              (date)                   (string)              (string)

shp                       stdt                                    fidt                         quay                  pnt

1111    2009-11-01 08:00:00    2009-11-01 08:00:00         1QA                  LC01        

1111    2009-11-01 08:00:00    2009-11-03 07:59:00         2QA

1111    2009-11-03 08:00:00    2009-11-11 07:59:00         3QA                  ST01

1111    2009-11-11 08:00:00    2009-11-20 07:59:00         2QA

1111    2009-11-20 08:00:00    2009-11-20 12:00:00         1QA

1111    2009-11-20 12:00:00    2009-11-30 07:59:00         3QA

1111    2009-11-30 08:00:00    2009-11-30 08:00:00                                  DL01

2222    2009-01-01 08:00:00    2009-12-02 08:00:00         4QA                 

2222    2009-12-02 08:00:00    2009-12-02 08:00:00                                  DL01

===============================================================

위와같은 형태로 DB에 들어가 있는데..

11월 2일 ~ 11월 20일로 검색을 하면 (stdt , fidt  둘다 검색하여 포함되어 있으면)

===============================================================

번호          이동전 위치(fidt, quay)        |          이동후 위치(stdt, quay)

1111    2009-11-03 07:59:00    2QA         2009-11-03 08:00:00    3QA

1111    2009-11-11 07:59:00    3QA         2009-11-11 08:00:00    2QA

1111    2009-11-20 07:59:00    2QA         2009-11-20 08:00:00    1QA  

1111    2009-11-20 12:00:00    1QA         2009-11-20 12:00:00     3QA

2222   2009-11-02 08:00:00    

===============================================================

11월 1일 ~ 11월 30일로 검색을 하면

===============================================================

번호          이동전 위치(fidt, quay)        |          이동후 위치(stdt, quay)

1111                                                               2009-11-01 08:00:00    1QA 

1111    2009-11-01 08:00:00   1QA          2009-11-01 08:00:00    2QA                             

1111    2009-11-03 07:59:00    2QA         2009-11-03 08:00:00    3QA

1111    2009-11-11 07:59:00    3QA         2009-11-11 08:00:00    2QA

1111    2009-11-20 07:59:00    2QA         2009-11-20 08:00:00    1QA  

1111    2009-11-20 12:00:00    1QA         2009-11-20 12:00:00     3QA

1111   2009-11-30 08:00:00     

2222   2009-11-02 08:00:00    

===============================================================

pnt 가 'LC01'일 경우 이동전 위치가 안나오고

'DL01'일 경우 이동후 위치가 안나와야 합니다

===============================================================

위와같은 형태의 데이터로 가져오고 싶습니다.

생각을 많이 해봤는데... 제가 가진 짧은 지식으로는 도저히 변환을 시킬수가 없어서

이렇게 질문을 올리게 되었습니다.

고수님들 도와주세요.. 부탁드립니다.

 

참... 게시판규칙에 익명은 사용하지 말라고 하셨는데..

제가 있는곳에서.. 회원가입 화면이 "접근불가" 로 뜨네요...

집에가면 가입하겠습니다. .

제 이름은 박재희입니다.

by 마농 [2009.12.06 20:30:45]
WITH t AS
(
SELECT '1111' shp, TO_DATE('200911010800','yyyymmddhh24mi') stdt, TO_DATE('200911010800','yyyymmddhh24mi') fidt, '1QA' quay, 'LC01' pnt FROM dual
UNION ALL SELECT '1111', TO_DATE('200911010800','yyyymmddhh24mi'), TO_DATE('200911030759','yyyymmddhh24mi'), '2QA', '' FROM dual
UNION ALL SELECT '1111', TO_DATE('200911030800','yyyymmddhh24mi'), TO_DATE('200911110759','yyyymmddhh24mi'), '3QA', 'ST01' FROM dual
UNION ALL SELECT '1111', TO_DATE('200911110800','yyyymmddhh24mi'), TO_DATE('200911200759','yyyymmddhh24mi'), '2QA', '' FROM dual
UNION ALL SELECT '1111', TO_DATE('200911200800','yyyymmddhh24mi'), TO_DATE('200911201200','yyyymmddhh24mi'), '1QA', '' FROM dual
UNION ALL SELECT '1111', TO_DATE('200911201200','yyyymmddhh24mi'), TO_DATE('200911300759','yyyymmddhh24mi'), '3QA', '' FROM dual
UNION ALL SELECT '1111', TO_DATE('200911300800','yyyymmddhh24mi'), TO_DATE('200911300800','yyyymmddhh24mi'), '1QA', 'DL01' FROM dual
)
, t1 AS
(
SELECT t.*
, ROW_NUMBER() OVER(PARTITION BY shp ORDER BY stdt, fidt) rn
FROM t
WHERE fidt >= TO_DATE(:from_dt,'yyyymmdd')
AND stdt < TO_DATE(:to_dt,'yyyymmdd') + 1
)
SELECT NVL(a.shp, b.shp) shp
, a.fidt
, a.quay
, b.stdt
, b.quay
FROM t1 a
FULL OUTER JOIN t1 b
ON a.shp = b.shp
AND a.rn = b.rn - 1
WHERE (a.fidt < TO_DATE(:to_dt,'yyyymmdd') + 1
OR b.stdt >= TO_DATE(:from_dt,'yyyymmdd') )
ORDER BY b.rn
;

by 박재희 [2009.12.07 09:11:35]
마농님 감사합니다.
한가지만 질문을 더 해도 될까요??
제가 미처 질문에 못올렸는데. shp별로 위의 데이터를 나누고 싶은데..
어떻게 하면 될까요??

by 박재희 [2009.12.07 09:53:26]
아.. 그리고..
pnt 가 'LC01'일 경우 이동전 위치가 안나오고
'DL01'일 경우 이동후 위치가 안나와야 합니다


by 마농 [2009.12.07 10:02:43]
원본과 결과물의 인과관계를 예측하기 어렵네요.
좀더 상세하게 설명해 주세요.

by 박재희 [2009.12.07 10:23:49]
pnt가 'LC01' 이면 어딘지는 모르지만 어떤 위치에서 현재 관리하는 위치(quay)로 들어오는 경우입니다.
pnt가 'DL01' 이면 현재 관리하는 위치(quay)에서 어떠한 위치로 나가는 경우입니다.
나머지의 경우는 위치(quay)가 변경되는 경우입니다.

위치(quay)가 변경된 경우에 대한 정보를 shp 별로 리스트로 출력하는 목적입니다.

by 마농 [2009.12.07 10:38:07]
그런 전반적인 조건 외에 각 결과 행이 왜 그렇게 나와야만 하는지에 대해서
상세한 설명이 필요할것 같은데요.

by 박재희 [2009.12.07 16:10:20]
왜 그렇게 나와야 하는지에 대한 설명은 저도 어렵네요 ㅠ.ㅠ
원본데이터는 shp번호별로 어떠한위치(quay)에서 존재한 기간(stdt ~ fidt)에 대한 정보 테이블입니다. 이러한 데이터를 가지고 shp 번호별로 언제, 어디로 옮겨갔는지에 대한(존재한 기간이 아닌 이동한 정보(날짜,장소)) 정보를 보고싶다고 '갑'쪽에서 요구하여 이러한 쿼리를 만들려고 하는겁니다.
제가 말주변이 없어서 자세한 설명이 되었는지요 ㅠ.ㅠ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입