SELECT
ymdseq
, NVL(
MAX
(LENGTH(
REPLACE
(x,
'W'
))), 0) r6
, NVL(
MAX
(LENGTH(
REPLACE
(x,
'R'
))), 0) w14
FROM
(
SELECT
ymdseq
--, vessel, crew, ymd, seq
, REGEXP_REPLACE(
REGEXP_REPLACE(
REGEXP_REPLACE(
SUBSTR(
REPLACE
(wm_concat(hval) OVER(
ORDER
BY
ymdseq, seq),
','
), -48)
,
'0{6,}'
,
'R'
)
,
'1{14,}'
,
'W'
)
,
'[^RW]'
)
AS
x
FROM
atable
WHERE
vessel =
'001'
AND
crew =
'100002'
AND
ymdseq >=
'20131227'
AND
ymdseq <=
'20140131'
||
'z'
)
WHERE
ymdseq >=
'20140101'
AND
ymdseq <=
'20140131'
||
'z'
GROUP
BY
ymdseq
ORDER
BY
ymdseq
;
-- 1. Self Join 을 통한 Group By 와 XMLAGG WITH t AS ( SELECT vessel, crew, ymd, ymdseq, seq, hval , ROW_NUMBER() OVER(ORDER BY ymdseq, seq) rn FROM atable WHERE vessel = '001' AND crew = '100002' AND ymdseq >= '20131227' AND ymdseq <= '20140131'||'z' ) SELECT a.vessel, a.crew, a.ymd, a.ymdseq, a.seq, a.hval , XMLAGG(XMLELEMENT(x, b.hval) ORDER BY b.rn).Extract('//text()').getStringVal() x FROM t a , t b WHERE b.rn BETWEEN a.rn - 47 AND a.rn GROUP BY a.vessel, a.crew, a.ymd, a.ymdseq, a.seq, a.hval ; -- 2. 계층쿼리를 이용한 Sys_Connect_By_Path WITH t AS ( SELECT vessel, crew, ymd, ymdseq, seq, hval , ROW_NUMBER() OVER(ORDER BY ymdseq, seq) rn FROM atable WHERE vessel = '001' AND crew = '100002' AND ymdseq >= '20131227' AND ymdseq <= '20140131'||'z' ) SELECT vessel, crew, ymd, ymdseq, seq, hval , SUBSTR( REPLACE(SYS_CONNECT_BY_PATH(hval, '-'), '-') , -48) x FROM t START WITH rn = 1 CONNECT BY PRIOR rn + 1 = rn ;