以前に接続を使用してフィールドを連結します
-
28-10-2019 - |
質問
次の表があります 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
これは間違っています。私は近いようですが、次のステップは何ではないのではないかと心配しています...
任意のヒント?
解決
あなたはあなたを制限する必要があります 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
/
両方のアプローチ(およびその他)が表示されます ここ.
所属していません StackOverflow