인쇄 대화 상자의 페이지 선택 순서와 유사하게 0과 1의 문자열을 1을 나타내는 정수 시퀀스로 변환해야합니다.0과 1의 순서를 인쇄 스타일 페이지 목록으로 변환하십시오.
'0011001110101'-> '3-4,7-9,11,13'
하나의 SQL select (Oracle 11g)에서이 작업을 수행 할 수 있습니까?
나는 다음과 같이 페이지 번호의 개별 목록을 얻을 수 있습니다
with data as (
select 'K1' KEY, '0011001110101' VAL from dual
union select 'K2', '0101000110' from dual
union select 'K3', '011100011010' from dual
)
select
KEY,
listagg(ords.column_value, ',') within group (
order by ords.column_value
) PAGES
from
data
cross join (
table(cast(multiset(
select level
from dual
connect by level <= length(VAL)
) as sys.OdciNumberList)) ords
)
where
substr(VAL, ords.column_value, 1) = '1'
group by
KEY
하지만 그건 그룹화를하지 않습니다 (예를 들어 반환 "3,4,7,8,9,11,13 "첫 번째 값).
값이 바뀔 때마다 그룹 번호를 할당 할 수 있다면 분석 함수를 사용하여 각 그룹의 최소값과 최대 값을 구할 수 있습니다. 나는. 내가 다음을 생성 할 수 있다면 나는 설정 될 것이다 :
Key Page Val Group
K1 1 0 1
K1 2 0 1
K1 3 1 2
K1 4 1 2
K1 5 0 3
K1 6 0 3
K1 7 1 4
K1 8 1 4
K1 9 1 4
K1 10 0 5
K1 11 1 6
K1 12 0 7
K1 13 1 8
그러나 나는 그것에 붙어있다.
누구나 아이디어를 얻거나 다른 방법을 사용할 수 있습니까? 모든하자 수준의 첫번째
! 내가 확장 된 데이터를 기반으로 재귀 쿼리를 사용하여 작동하는 무언가를 가지고 있지만, 귀하의 순서가 더 빠르게 말할 것도없고 훨씬 더 우아합니다. – Barney