Конкатенация полей с использованием подключения по предварительному - PullRequest
1 голос
/ 15 июня 2011

Имея следующую таблицу my_tabe:

M01 |   1
M01 |   2
M02 |   1

Я хочу запросить его, чтобы получить:

M01 |   1,2
M02 |   1

Мне удалось приблизиться, используя следующий запрос:

with my_tabe as
(
    select 'M01' as scycle, '1' as sdate from dual union
    select 'M01' as scycle, '2' as sdate from dual union
    select 'M02' as scycle, '1' as sdate from dual
)
SELECT scycle, ltrim(sys_connect_by_path(sdate, ','), ',')
FROM
(
    select scycle, sdate, rownum rn
    from my_tabe
    order by 1 desc
)
START WITH rn = 1
CONNECT BY PRIOR rn = rn - 1

Уступая:

SCYCLE      |   RES
M02         |   1,2,1
M01         |   1,2

Что не так. Кажется, я рядом, но боюсь, что не знаю, что будет дальше ...

Какие-нибудь советы?

1 Ответ

2 голосов
/ 15 июня 2011

Вам нужно ограничить ваше connect by тем же значением scycle, а также посчитать количество совпадений и отфильтровать их, чтобы избежать промежуточных результатов.

with my_tabe as
(
    select 'M01' as scycle, '1' as sdate from dual union
    select 'M01' as scycle, '2' as sdate from dual union
    select 'M02' as scycle, '1' as sdate from dual
)
select scycle, ltrim(sys_connect_by_path(sdate, ','), ',')
from
(
    select distinct sdate,
        scycle,
        count(1) over (partition by scycle) as cnt,
        row_number() over (partition by scycle order by sdate) as rn
    from my_tabe
)
where rn = cnt
start with rn = 1
connect by prior rn + 1 = rn
and prior scycle = scycle
/

SCYCLE LTRIM(SYS_CONNECT_BY_PATH(SDATE,','),',')
------ -----------------------------------------
M01    1,2
M02    1

Если вы используете 11g, вы можете использовать встроенную функцию LISTAGG вместо:

with my_tabe as
(
    select 'M01' as scycle, '1' as sdate from dual union
    select 'M01' as scycle, '2' as sdate from dual union
    select 'M02' as scycle, '1' as sdate from dual
)
select scycle, listagg (sdate, ',') 
within group (order by sdate) res
from my_tabe
group by scycle
/ 

Оба подхода (и другие) показаны здесь .

...