先演示典型的用法 输入select LISTAGG(姓名,',') WITHIN GROUP(order by 号码 ) as 合并后 from TMP_EXP 即连接姓名字段,用逗号分隔,并按号码来进行排序。可以看到结果5行数据的姓名都合并到一列中了。
还可以结合over(PARTITION BY 字段) 来对结果进行分组,执行语句select LISTAGG(姓名,',') WITHIN GROUP(order by 号码 ) over(PARTITION BY 性别) as 合并后 from TMP_EXP 按性别字段进行分组,可以看到结果男女都分开了。
不过上一步的结果有重复数据怎么办,可以用distinct 来消除重复数据,执行
select distinct LISTAGG(姓名,',') WITHIN GROUP(order by 号码 ) over(PARTITION BY 性别) as 合并后 from TMP_EXP 结果就变成只有两行数据。
另外结合使用group by 方法也能得到跟上一步相同的结果。 执行
select 性别, LISTAGG(姓名,'&') WITHIN GROUP(order by 号码 ) as 合并后 from TMP_EXP group by 性别 按性别字段分组后,再进行字符串连接结果也是两行合并后的数据。
最后还可以研究一些有趣的用法,比如
select 性别, substr(LISTAGG(号码,',') WITHIN GROUP(order by 号码 ),1, instr(LISTAGG(号码,',') WITHIN GROUP(order by 号码 ),',')-1) as 最靠前号码
from TMP_EXP group by 性别 利用了LISTAGG函数可以排序的特点列举出男女生中最靠前的号码分别是多少。