LAG, LEAD 함수 활용 법 문의 0 4 2,933

by 김성수 [2013.09.30 18:46:20]


고수님들 아래와 같이 결과가 나와야 하는 문제에 봉착 했습니다.
고수님들의 도움 청합니다. ^^

with a as

(

select 'A' as CODE, '10' AS STARTTIME, '20' AS ENDTIME from dual

union all

select 'B' as CODE, '20' AS STARTTIME, '30' AS ENDTIME from dual

union all

select 'C' as CODE, '30' AS STARTTIME, '40' AS ENDTIME from dual

union all

select 'D' as CODE, '40' AS STARTTIME, '50' AS ENDTIME from dual

union all

select 'E' as CODE, '50' AS STARTTIME, '100' AS ENDTIME from dual

)

select * from a;

 

CODE

STARTTIME

ENDTIME

A

5

20

B

20

30

C

30

40

D

40

50

E

50

100

 

CUTOFF의 조건
    STARTTIME : 10
    ENDTIME   : 60
A의 경우 START 5이지만 CUTOFF 10 이기 때문에

시작이 10 으로 나와야 하며

 

E의 경우 END 100 이지만 CUTOFF 60 이기 때문에

 다음 행으로 넘어갑니다.

 

[결과]

CODE

STARTTIME

ENDTIME

A

10

20

B

20

30

C

30

40

D

40

50

E

50

60

 

60

100

 

by 아발란체 [2013.10.01 09:21:11]
 
WITH A AS (
 SELECT 'A' AS code, '10' AS starttime, '20' AS endtime FROM DUAL
 UNION ALL
 SELECT 'B', '20', '30' FROM DUAL
 UNION ALL
 SELECT 'C', '30', '40' FROM DUAL
 UNION ALL
 SELECT 'D', '40', '50' FROM DUAL
 UNION ALL
 SELECT 'E', '50', '100' FROM DUAL
)
SELECT
 code,
 CASE WHEN(TO_NUMBER(LAG(MAX(endtime)) OVER(ORDER BY CODE)) > 60) THEN '60' ELSE MAX(starttime) END AS starttime,
 CASE WHEN(TO_NUMBER(MAX(endtime)) > 60) THEN '60' ELSE DECODE(CODE, NULL, LAG(MAX(ENDTIME))OVER(ORDER BY CODE), MAX(endtime)) END AS endtime
FROM
 A
GROUP BY
 ROLLUP(code)
;
--참고만 하세요, 모범 답안은 곧 올라 올 것 같습니다. ^^;

by 마농 [2013.10.01 10:17:14]
기준이 모호하네요.
앞에 5~10 은 안나와야 되고, 뒤에 60~100은 나와야 하나요?
둘다 안나오던가? 둘다 나오던가 기준이 동일해야 하는 것 아닌지요?

by 김성수 [2013.10.01 18:38:24]
5~10은 안나와도 되구요
뒤에 60~100은 나오면 되는 결과 입니다. ^^;

by 마농 [2013.10.02 08:17:28]
WITH a AS
(
SELECT 'A' code, 5 starttime, 20 endtime FROM dual
UNION ALL SELECT 'B', 20,  30 FROM dual
UNION ALL SELECT 'C', 30,  40 FROM dual
UNION ALL SELECT 'D', 40,  50 FROM dual
UNION ALL SELECT 'E', 50, 100 FROM dual
)
SELECT code
     , DECODE(lv, 2, b.e, GREATEST(b.s, a.starttime)) starttime
     , DECODE(lv, 2, a.endtime, LEAST(b.e, a.endtime)) endtime
  FROM a
     , (SELECT 10 s, 60 e FROM dual) b
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2) c
 WHERE b.e >= a.starttime
   AND b.s <= a.endtime
   AND c.lv <= CASE WHEN b.e < a.endtime THEN 2 ELSE 1 END
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입