罪恶,,,,居然在图书馆占位子,,,
标题不知道怎么写比较适合,这是群里面一个小伙伴问我的问题,一番折腾后感觉思路比较有意思,就记录一下。
问题:
大概就是一个字符串:"11-12,11-21,11-22,11-24",需要处理成"11-12至11-21,11-22至11-24",即两个日期为一组,用“至”连接,然后每组日期用逗号隔开。
于是乎,折腾一番后,
思路是:
1、先按逗号拆分成单个日期,加上一个分组字段,连续两个日期为同一组;
2、按照分组用listagg进行聚合,用“至”分隔,这样,两个为一组的就拼接出来了;
3、将各组重新聚合,用逗号分隔,如此。
代码如下,with as的结构跟上面思路分点一样:
with t1 as (
select regexp_substr('11-12,11-21,11-22,11-24', '[^,]+', 1, level ) dt
, level lv, round(level/2) grp
from dual
connect by level <= regexp_count('11-12,11-21,11-22,11-247', '[^,]+')
), t2 as (
select grp, listagg(dt, '至')within group(order by lv) str
from t1 group by grp
)
select listagg(str, ',')within group(order by grp) str from t2;