默認情況下,使用wm_concat和group by拼接字段時,拼接的字段順序是無規則的。
創建測試數據:
create table tb( seq number(10), remark varchar2(100), createtime date ); insert into tb(seq, remark, createtime) select 1, '說明1', to_date('20210101','yyyymmdd') from dual union all select 1, '說明2', to_date('20210111','yyyymmdd') from dual union all select 1, '說明3', to_date('20210201','yyyymmdd') from dual union all select 1, '說明4', to_date('20210208','yyyymmdd') from dual union all select 5, '說明5', to_date('20210301','yyyymmdd') from dual ;
需求:按照創建日期createtime字段排序,拼接remark字段。
首先,按照wm_concat和group by查詢,wm_concat拼接后的結果沒有排序。
select seq, wm_concat('[' || to_char(createtime, 'yyyy-mm-dd') || ']' || remark) remark from tb group by seq;
有2種解決方法。
方法1:
使用wm_concat over(partition by 分組字段 order by 排序字段)后,外面再套max和group by 查詢
select seq, max(remark) remark from (select seq, wm_concat('[' || to_char(createtime, 'yyyy-mm-dd') || ']' || remark) over(partition by seq order by createtime) remark from tb ) group by seq;
里面一層
select seq, wm_concat('[' || to_char(createtime, 'yyyy-mm-dd') || ']' || remark) over(partition by seq order by createtime) remark from tb
查詢結果如下:
方法2:
如果是Oracle 11g以上版本,使用Oracle 11g新增的函數listagg,可以實現按條件列轉行,它有2個參數,第1個參數為需要拼接的字段,第2個參數為分隔符(可選)
select seq, listagg('[' || to_char(createtime, 'yyyy-mm-dd') || ']' || remark, ',') within group(order by createtime) remark from tb group by seq;