使用先验连接连接字段
有下表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
Yielding:
SCYCLE | RES
M02 | 1,2,1
M01 | 1,2
这是错误的。看起来我已经很接近了,但恐怕我不知道下一步是什么......
有什么建议吗?
Having the following table my_tabe
:
M01 | 1
M01 | 2
M02 | 1
I want to query over it in order to obtain:
M01 | 1,2
M02 | 1
I managed to get close using the following query:
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
Yielding:
SCYCLE | RES
M02 | 1,2,1
M01 | 1,2
Which is wrong. It's seems I'm close, but I'm afraid I don't what's the next step...
Any tips?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要将
connect by
限制为相同的scycle
值,并计算匹配数并对其进行过滤,以避免看到中间结果。如果您使用的是 11g,则可以使用内置的 改为
LISTAGG
函数:两种方法(以及其他方法)均显示此处。
You need to restrict your
connect by
to the samescycle
value, and also count the number of matches and filter on that to avoid seeing intermediate results.If you're on 11g you can use the built-in
LISTAGG
function instead:Both approaches (and others) are shown here.