문제
나는 다음 표가있다
id count hour age range
-------------------------------------
0 5 10 61 10-200
1 6 20 61 10-200
2 7 15 61 10-200
5 9 5 61 201-300
7 10 25 61 201-300
0 5 10 62 10-20
1 6 20 62 10-20
2 7 15 62 10-20
5 9 5 62 21-30
1 8 6 62 21-30
7 10 25 62 21-30
10 15 30 62 31-40
.
열 범위의 별개 값을 선택해야합니다. 나는 다음 질의 을 시도했다
Select distinct range as interval from table name where age = 62;
.
결과는 다음과 같이 열에 있습니다.
interval
----------
10-20
21-30
31-41
.
어떻게 결과를 얻을 수 있습니까?
10-20, 21-30, 31-40
.
편집 : 나는 이제 쿼리를 시도하고있다 :
select sys_connect_by_path(range,',') interval
from
(select distinct NVL(range,'0') range , ROW_NUMBER() OVER (ORDER BY RANGE) rn
from table_name where age = 62)
where connect_by_isleaf = 1 CONNECT BY rn = PRIOR rn+1 start with rn = 1;
.
나에게 출력을주는 것 :
Interval
----------------------------------------------------------------------------
, 10-20,10-20,10-20,21-30,21-30, 31-40
.
님 Plz가 원하는 출력을 얻도록 도와줍니다.
해결책
11.1만이 대신 11.1 이하의 경우 LISTAGG
집계 함수를 사용할 수 있습니다
SELECT listagg( interval, ',' )
WITHIN GROUP( ORDER BY interval )
FROM (SELECT DISTINCT range AS interval
FROM table_name
WHERE age = 62)
.
이전 버전의 Oracle을 사용하는 경우 다른 Oracle String Aggregation 기술 팀홀 페이지에서.11.2 이전의 개인 기본 설정은 사용자 정의 집계 함수를 만드는 것입니다.
SELECT string_agg( interval )
FROM (SELECT DISTINCT range AS interval
FROM table_name
WHERE age = 62)
.
함수를 만들지 않으려면 row_number 및 sys_connect_by_path 접근법 를 따르는 것이 조금 더 어려워지는 경향이 있습니다.
with x as (
SELECT DISTINCT range AS interval
FROM table_name
WHERE age = 62 )
select ltrim( max( sys_connect_by_path(interval, ','))
keep (dense_rank last order by curr),
',') range
from (select interval,
row_number() over (order by interval) as curr,
row_number() over (order by interval) -1 as prev
from x)
connect by prev = PRIOR curr
start with curr = 1
. 제휴하지 않습니다 StackOverflow