Oracle에서 공백 시간을 구하는 방법을 문의 드립니다. 도와주세요... 0 7 2,436

by 곰순이 [SQL Query] 공백 시간 스케쥴 oracle sql 10g 11g [2018.10.05 17:27:58]


구분 출발 도착
A 09 10
A 10 12
A 16 18
B 09 10
B 10 13
B 17 18
C 13 16
C 16 17
D 14 18
D 19 20
F 09 11

위와 같이 데이터가 있을때

출발 값 : 14 

도착 값 : 16

이라고 입력 값이 들어오면

구분 출발 도착
A 10 12
B 10 13
F 09 11

이라는 결과값을 얻고 싶은데

쿼리로 가능한지 고수님들 도와주세요.

by 우리집아찌 [2018.10.05 18:23:39]

설명좀 해주세요. 출발값과 도착값이 어떻게 적요되죠?


by 곰순이 [2018.10.08 11:32:42]

아 너무 뜬금없이 문의를 드렸네요...

A,B,C,D,E,F 라는 사람에 각각의 하루 작업량이 있는데 새로운 작업이 들어왔을 시에 해당 인원들의 작업시간 중

입력된 새로운 작업을 소화해 낼 수 있는 공백이 생기는 인원을 찾는 것으로 찾아지는 시간은 해당인원의

공백시간으로 비는 시간의 바로 직전에 완료되는 작업을 찾으면 되는..건데..

설명하는 재주가 워낙 없어서 =ㅈ=;;;; 죄송합니다.


by 우리집아찌 [2018.10.05 18:26:19]
-- 답에만 맞췄어요.,
WITH T ( 구분,출발,도착) AS (
SELECT 'A' , '09' ,'10' FROM DUAL UNION ALL
SELECT 'A' , '10' ,'12' FROM DUAL UNION ALL
SELECT 'A' , '16' ,'18' FROM DUAL UNION ALL
SELECT 'B' , '09' ,'10' FROM DUAL UNION ALL
SELECT 'B' , '10' ,'13' FROM DUAL UNION ALL
SELECT 'B' , '17' ,'18' FROM DUAL UNION ALL
SELECT 'C' , '13' ,'16' FROM DUAL UNION ALL
SELECT 'C' , '16' ,'17' FROM DUAL UNION ALL
SELECT 'D' , '14' ,'18' FROM DUAL UNION ALL
SELECT 'D' , '19' ,'20' FROM DUAL UNION ALL
SELECT 'F' , '09' ,'11' FROM DUAL 
)

SELECT * 
  FROM (SELECT 구분 , 출발 , 도착
             , ROW_NUMBER() OVER(PARTITION BY 구분 ORDER BY 출발 DESC ) RN
          FROM T 
         WHERE 출발 < 14
           AND 도착 < 16
        )
  WHERE RN = 1 

 


by 곰순이 [2018.10.08 15:00:40]

감사합니다. 정말 많은 도움 되었습니다.


by 마농 [2018.10.08 11:49:37]
WITH t AS
(
SELECT 'A' id, '09' stm, '10' etm FROM dual
UNION ALL SELECT 'A', '10', '12' FROM dual
UNION ALL SELECT 'A', '16', '18' FROM dual
UNION ALL SELECT 'B', '09', '10' FROM dual
UNION ALL SELECT 'B', '10', '13' FROM dual
UNION ALL SELECT 'B', '17', '18' FROM dual
UNION ALL SELECT 'C', '13', '16' FROM dual
UNION ALL SELECT 'C', '16', '17' FROM dual
UNION ALL SELECT 'D', '14', '18' FROM dual
UNION ALL SELECT 'D', '19', '20' FROM dual
UNION ALL SELECT 'F', '09', '11' FROM dual
)
SELECT b.id
     , MAX(c.stm) s
     , MAX(c.etm) e
  FROM dual a
  LEFT OUTER JOIN t b
  PARTITION BY (b.id)
    ON b.stm < '16'
   AND b.etm > '14'
  LEFT JOIN t c
    ON b.id = c.id
   AND c.etm <= '14'
 WHERE b.stm IS NULL
 GROUP BY b.id
;

 


by 곰순이 [2018.10.08 15:00:56]

감사합니다. 많은 도움 되었습니다.


by 마농 [2018.10.08 15:29:32]
SELECT id
     , MAX(CASE WHEN etm <= '14' THEN stm END) stm
     , MAX(CASE WHEN etm <= '14' THEN etm END) etm
  FROM t
 GROUP BY id
HAVING COUNT(CASE WHEN stm < '16' AND etm > '14' THEN 1 END) = 0
;

 

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