문제

나는 다음 표가있다

    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
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top