쿼리 세로줄 끼리의 계산 방법 도움요청드립니다. 0 2 825

by DB 꿈나무 [Oracle 기초] [2019.05.02 11:14:21]


20190502_110352.png (29,729Bytes)
20190501_105705.png (46,692Bytes)

이건 제가 만든 쿼리입니다. 회사에 들어와 혼자 오라클 독학한지 4개월 밖에 안되서

쿼리를 짜는게 전문적이지 않고 많이 서투릅니다.

SELECT ROUTEID as 노선ID,
       FC_BUSROUTE_ROUTENO(ROUTEID) 노선번호,
       FC_BUS_CARREGNO(BUSID) AS 버스번호,
       FC_BUSSTOP_SHORTID(NODEID)  as 정류장ID,
       FC_BUSSTOP_BSTOPNM(NODEID) AS 정류소명,
       DECODE(fc_pathseq_dircd(routeid, pathseq), 0, '상행', 1, '하행') AS 상행하행, 
       DECODE(EVTSUBTPCD, 1,'교차로통과', 2, '도착', 3, '출발') AS 이벤트,
       EVT_OCCURDT AS 이벤트시간,
       RUNTM as 운행시간,
       RUNDIST as 운행거리,
       RUNSPD as 운행속도
       --DECODE(TRUNC(RUNTM / 60),0,'',TRUNC(RUNTM/60)|| '분') ||
       --LPAD((MOD(RUNTM,60)),2,'0')||'초' as 운행시간환산
       --RUNTM - lag(RUNTM) over (order by RUNTM)  as 시간차
FROM
(SELECT
       ROUTEID,
       BUSID,
       NODEID,
       EVTSUBTPCD,
       EVT_OCCURDT,
       PATHSEQ,
       DECODE(EVTSUBTPCD, 2, EVT_OCCURDT,  LAG(EVT_OCCURDT) OVER (ORDER BY EVT_OCCURDT)) AS 도착,
       DECODE(EVTSUBTPCD, 3, EVT_OCCURDT) AS 출발,
       DECODE(EVTSUBTPCD, 1, EVT_OCCURDT,  LAG(EVT_OCCURDT) OVER (ORDER BY EVT_OCCURDT)) AS 교차로통과,
       RUNSPD,
       RUNDIST,
       RUNTM
FROM TB_BMH_RUNEVTCOLL
WHERE ROUTEID = 165000002
AND EVTSUBTPCD IN (1,2,3)
AND EVT_OCCURDT > TO_DATE('2019042715000','YYYYMMDDHH24MISS')
AND EVT_OCCURDT < TO_DATE('2019042716000','YYYYMMDDHH24MISS')
and TB_BMH_RUNEVTCOLL.EVTTPCD = 21
--AND BUSID = 7016117
ORDER BY EVT_OCCURDT) A
order by 3,8,4

첫번째는 이쿼리의 결과값이고 두번째는 제가 원하는 결과값입니다.

이벤트시간과 운행시간에 대하여 첫번째값과 두번째값의 차이, 두번째값과 세번째값의 차이, 세번째값과 네번째값의 차이 이런식으로 쭉 계산이 되여 그 차이값이 옆에 표출이 되었으면 합니다. 제가 아는 선에서 lag도 써보고 이것저것 해봤는데 짧은 지식으로는 원하는 값이 나오지 않아 도움 요청드립니다.

아..차이값은 둘다 절대값으로 나왔으면 합니다.

 

by 마농 [2019.05.06 23:42:08]
SELECT routeid                      AS 노선id
     , fc_busroute_routeno(routeid) AS 노선번호
     , fc_bus_carregno(busid)       AS 버스번호
     , fc_busstop_shortid(nodeid)   AS 정류장id
     , fc_busstop_bstopnm(nodeid)   AS 정류소명
     , DECODE(fc_pathseq_dircd(routeid, pathseq), 0, '상행', 1, '하행') AS 상행하행
     , DECODE(evtsubtpcd, 1, '교차로통과', 2, '도착', 3, '출발')        AS 이벤트
     , evt_occurdt AS 이벤트시간
     , runtm       AS 운행시간
     , rundist     AS 운행거리
     , runspd      AS 운행속도
     , ROUND(
       ( evt_occurdt
       - LAG(evt_occurdt, 1, evt_occurdt) OVER(PARTITION BY routeid, busid ORDER BY evt_occurdt)
       ) * 24 * 60 * 60
       ) AS 이벤트시간차
     , ( runtm
       - LAG(runtm      , 1, runtm      ) OVER(PARTITION BY routeid, busid ORDER BY evt_occurdt)
       ) AS 이벤트시간차
  FROM tb_bmh_runevtcoll
 WHERE routeid      = 165000002
   AND evtsubtpcd  IN (1,2,3)
   AND evt_occurdt >= TO_DATE('2019042715', 'yyyymmddhh24')
   AND evt_occurdt <  TO_DATE('2019042716', 'yyyymmddhh24')
   AND evttpcd      = 21
-- AND busid        = 7016117
;

 


by DB 꿈나무 [2019.05.07 08:57:10]

감사합니다 마농님. 저도 LAG함수로 계속 고민하고 있었는데 제가 할때는 값들이 이상하게 나와서 힘들었는데 덕분해 해결 했습니다.

잘 분석해서 공부하겠습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입