비슷한 시간대의 결과값을 그룹의 최소값이나 최대값등의 결과가 1개의 결과 표출되는법 도움요청드려요 0 2 884

by DB 꿈나무 [Oracle 기초] [2019.03.08 11:12:15]


20190308_100912.png (65,280Bytes)

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번째 사진처럼 다른 경우가 나와서 머리를 쥐어짜내서 해결하려고 해도 도무지 방법이 떠오르지 않아 도움요청드립니다.

by 마농 [2019.03.08 11:35:21]
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
;

 


by DB 꿈나무 [2019.03.08 12:22:36]

감사합니다 마농님. 마농님께서 수정하신부분은 제가 너무 초보라 몰라서 구글에 이리저리 검색도 해보고

저혼자 스스로 저부분을 이것저것 수정해봐도 어려운 부분이 있는데 덕분에 많은 도움이 됩니다. 감사합니다.

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