значения столбца в строке - PullRequest
       37

значения столбца в строке

1 голос
/ 28 февраля 2012

У меня есть следующая таблица

    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

Ребята, плз, помогите мне получить желаемый результат.

1 Ответ

2 голосов
/ 28 февраля 2012

Если вы используете 11.2, а не просто 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 на странице Тима Холла. До 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...