by DB 꿈나무 [Oracle 기초] [2019.03.08 11:12:15]
SELECT *
FROM (SELECT a.procdt AS 가공일시
, b.routeno AS 노선번호
, e.bstopnm AS 정류소명
, a.bitid AS BITID
, e.short_bstopid AS 정류소단축ID
, e.bstopid AS 정류소ID
, a.routeid AS 버스노선ID
, c.carregno AS 차량번호
, a.busid AS 버스ID
, a.rest_bstopcnt AS 잔여정류소
, TRUNC(a.arrplantm/60)||'분'||MOD(a.arrplantm,60)||'초' AS 도착예정시간
, COUNT(*) OVER(ORDER BY a.procdt
RANGE BETWEEN INTERVAL '40' SECOND PRECEDING AND CURRENT ROW) cnt
FROM tb_ish_bitbusarriv a
, tb_adm_busroute b
, tb_adm_bus c
, tb_omm_bit d
, tb_adm_busstop e
WHERE a.routeid = b.routeid
AND a.busid = c.busid
AND a.bitid = d.bitid
AND d.bstopid = e.bstopid
AND a.procdt >= TO_DATE('2019-03-01', 'yyyy-mm-dd')
AND a.procdt < TO_DATE('2019-03-01', 'yyyy-mm-dd') + 1
AND e.short_bstopid = 36107
AND a.busid = 7013850
AND a.routeid = 165000014
AND a.arrplantm = 0
)
WHERE cnt = 1
어제 마농님께서 빨간색 부분을 손봐주셔서 제가 원하는대로 완벽하게 결론이 도출이 되었었는데, 조건을 바꾸자 다른 경우가 생겨 조언좀 부탁드립니다. 첫번째 사진이 마농님이 손봐주기 전 결과값이고 2번째 사진이 해결후 결과값인데 cnt가 1,2로 나오면 1의 조건을 걸어서 결과를 도출해 낸건 어느정도 이해를 했는데 3번째 사진처럼 다른 경우가 나와서 머리를 쥐어짜내서 해결하려고 해도 도무지 방법이 떠오르지 않아 도움요청드립니다.
SELECT * FROM (SELECT a.procdt AS 가공일시 , b.routeno AS 노선번호 , e.bstopnm AS 정류소명 , a.bitid AS BITID , e.short_bstopid AS 정류소단축ID , e.bstopid AS 정류소ID , a.routeid AS 버스노선ID , c.carregno AS 차량번호 , a.busid AS 버스ID , a.rest_bstopcnt AS 잔여정류소 , TRUNC(a.arrplantm/60)||'분'||MOD(a.arrplantm,60)||'초' AS 도착예정시간 , ROW_NUMBER() OVER(PARTITION BY a.procdt ORDER BY 1) rn , COUNT(*) OVER(ORDER BY a.procdt RANGE BETWEEN INTERVAL '40' SECOND PRECEDING AND INTERVAL '1' SECOND PRECEDING) cnt FROM tb_ish_bitbusarriv a , tb_adm_busroute b , tb_adm_bus c , tb_omm_bit d , tb_adm_busstop e WHERE a.routeid = b.routeid AND a.busid = c.busid AND a.bitid = d.bitid AND d.bstopid = e.bstopid AND a.procdt >= TO_DATE('2019-03-01', 'yyyy-mm-dd') AND a.procdt < TO_DATE('2019-03-01', 'yyyy-mm-dd') + 1 AND e.short_bstopid = 36107 AND a.busid = 7013850 AND a.routeid = 165000014 AND a.arrplantm = 0 ) WHERE cnt = 0 AND rn = 1 ;