前言#
今天要帮业务写一个取数的SQL,其中要用到分组函数,并且要取到各个分组内详细的数据,因为用到的比较少,不太清楚要怎么实现,在网上找到listagg函数可以实现,所以记录下它的应用
Listagg()详解#
概述#
listagg()函数可以实现多列记录聚合为一条记录,其实就是列转行;可以单独使用,也可以与GROUP BY一起使用
像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来
基本语法#
LISTAGG(measure_expr,delimiter) WITHIN GROUP( ORDER BY XXX)
- measure_expr : 需要拼接汇总的列名
- delimiter : 分隔符,默认NULL
- ORDER BY XXX : 按照什么排序
示例
点击查看代码
高级用法#
listagg(XXX, ‘,’) within GROUP (order by XXX) over (partition by XXX) rank
能够通过【partition by】按照不同的层级划分
示例
点击查看代码
拓展#
Mysql group_concat函数#
MySQL中也有类似的函数,就是group_concat函数
基本语法#
group_concat([DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’])
示例
点击查看代码
注意#
- Mysql的group_concat函数是
可以去重的
,需要结合GROUP BY使用 - Oracle的Listagg()函数
无法进行去重
,如果要去重的话,可以使用下列三种方法- 使用wm_concat() + distinct去重聚合【oracle官方不太推荐】
- 使用正则替换方式去重【仅适用于oracle字符串大小比较小的情况】
- 先去重,再聚合【推荐使用】
参考博客#
转自:https://www.cnblogs.com/kssw/p/16122987.html