现有一张数据表
create table t(
name          varchar2(10),
content       varchar2(10),
sys_date      date
)现在想对这张表按name做group操作后,把content段的字符拼接起来,并且拼接的次序是按照sys_date排序的。例如有数据:
张三,吃饭,20110504
张三,睡觉,20110503
李四,打牌,20110504获得的结果应该是这样的:
张三,睡觉;吃饭
李四,打牌使用wm_concat是可以实现字符串拼接
select name,wm_concat(content) from t group by name但是这样我不能指定拼接时的顺序,有谁知道如何解决么?谢谢了。

解决方案 »

  1.   

    with t as (
    select '张三' name,'吃饭' content, date'2011-05-04' sys_date from dual union all
    select '张三' name,'睡觉' content, date'2011-05-03' sys_date from dual union all
    select '李四' name,'打牌' content, date'2011-05-04' sys_date from dual)SELECT NAME, wm_concat(content)
      FROM (SELECT * FROM t ORDER BY sys_date)
     GROUP BY NAME;
      

  2.   

    with t as (
    select '张三' name,'吃饭' content, date'2011-05-04' sys_date from dual union all
    select '张三' name,'睡觉' content, date'2011-05-03' sys_date from dual union all
    select '李四' name,'打牌' content, date'2011-05-04' sys_date from dual)select name,max(content) from (
    SELECT NAME, wm_concat(content)over(partition by name order by sys_date asc) content
      FROM t)group  by name  ;
      

  3.   

    刚实验了一下,用order by 这种方式是不行的。应该是在group的时候,把顺序又打乱了。over(partition by name order by sys_date asc) 这种方法是可以的。但是运行效率还有待观察。
      

  4.   

    wm_concat比较奇怪,可能是采用odci接口的原因,不会按照子查询里的顺序进行处理.目前只发现可以用分析函数强制排序,但是代价就是效率可能不会很高.因为他会对每条信息产生一个排序.不过想来效率影响应该比较小,因为毕竟分析函数机制是oracle内建的,比自己去实现要高效一些.