Oracle函数之listagg函数

article/2025/10/4 8:38:34

语法

在这里插入图片描述
有点难以看懂,个人理解listagg是list aggregate的缩写(错了勿喷),也就是列表总计,聚合的意思。
官方文档解释为:

LISTAGG orders data within each group specified in the ORDER BY clause and then concatenates the values of the measure column.

大概意思就是listagg函数先在每个组里用order by子句排序之后,再拼接每个分组里特指的列值。
从上面的解释可以知道,listagg每个组进行操作并返回一个输出行。

注意:这里的组在没有group by子句的时候指的是整个结果集,partition by子句指的是结果集中分区。

参数解释

上图的参数有:

  • ALL:ALL关键字是可选的。
  • measure_expr :measure_expr是被操作的列,可以是任何表达式。被操作的列中的空值将被忽略。
  • delimiter:分隔符,用来分割被操作列的列值,就是拼接每个列值后面跟一个分隔符,最后一个列值除外,分隔符也是可选的,默认值为NULL。
  • listagg_overflow_clause:这个子句控制当返回值超过返回数据类型的最大长度时函数的行为。也是可选的。
  • order_by_clause:顾名思义,排序子句。决定被连接值的顺序,谁在前谁在后。
  • query_partition_clause:listagg根据query_partition_clause中的一个或多个表达式将查询结果集划分为多个区(partition)。即分区之后,再进行列值拼接,注意partition的字段没有进行去重,仅仅是分区后进行处理,不会改变行数。Parttion by 关键字是Oracle中分析函数的一部分,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的结果。

实例

聚合函数

SELECT LISTAGG(last_name, '; ')WITHIN GROUP (ORDER BY hire_date, last_name) "Emp_list",MIN(hire_date) "Earliest"FROM employeesWHERE department_id = 30;Emp_list                                                     Earliest
------------------------------------------------------------ ---------
Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares            07-DEC-02
SELECT department_id "Dept.",LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date) "Employees"FROM employeesGROUP BY department_idORDER BY department_id;Dept. Employees
------ ------------------------------------------------------------10 Whalen20 Hartstein; Fay30 Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares40 Mavris50 Kaufling; Ladwig; Rajs; Sarchand; Bell; Mallin; Weiss; Davies; Marlow; Bull; Everett; Fripp; Chung; Nayer; Dilly; Bissot; Vollman; Stiles; Atkinson; Taylor; Seo; Fleaur; Matos; Patel; Walsh; Feeney; Dellinger; McCain; Vargas; Gates; Rogers;Mikkilineni; Landry; Cabrio; Jones; Olson; OConnell; Sullivan; Mourgos; Gee; Perkins; Grant; Geoni; Philtanker; Markle60 Austin; Hunold; Pataballa; Lorentz; Ernst70 Baer
. . .
SELECT department_id "Dept.",LISTAGG(last_name, '; ' ON OVERFLOW TRUNCATE '...')WITHIN GROUP (ORDER BY hire_date) "Employees"FROM employeesGROUP BY department_idORDER BY department_id;Dept. Employees
------ ------------------------------------------------------------10 Whalen20 Hartstein; Fay30 Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares40 Mavris50 Kaufling; Ladwig; Rajs; Sarchand; Bell; Mallin; Weiss; Davies; Marlow; Bull; Everett; Fripp; Chung; Nayer; Dilly; Bissot; Vollman; Stiles; Atkinson; Taylor; Seo; Fleaur; ... (23)70 Baer
. . .

分析函数

SELECT department_id "Dept", hire_date "Date", last_name "Name",LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date, last_name)OVER (PARTITION BY department_id) as "Emp_list"FROM employeesWHERE hire_date < '01-SEP-2003'ORDER BY "Dept", "Date", "Name";Dept Date      Name            Emp_list
----- --------- --------------- ---------------------------------------------30 07-DEC-02 Raphaely        Raphaely; Khoo30 18-MAY-03 Khoo            Raphaely; Khoo40 07-JUN-02 Mavris          Mavris50 01-MAY-03 Kaufling        Kaufling; Ladwig50 14-JUL-03 Ladwig          Kaufling; Ladwig70 07-JUN-02 Baer            Baer90 13-JAN-01 De Haan         De Haan; King90 17-JUN-03 King            De Haan; King100 16-AUG-02 Faviet          Faviet; Greenberg100 17-AUG-02 Greenberg       Faviet; Greenberg110 07-JUN-02 Gietz           Gietz; Higgins110 07-JUN-02 Higgins         Gietz; Higgins

先进行"Dept", “Date”, "Name"分组得到分组结果,再对结果集进行"department_id"分区,最后整合列值。

参考官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/LISTAGG.html#GUID-B6E50D8E-F467-425B-9436-F7F8BF38D466


http://chatgpt.dhexx.cn/article/FZA9Oybe.shtml

相关文章

listagg()行转列函数

--基础数据 DROP TABLE "ZYH_TEST"; CREATE TABLE "ZYH_TEST" ("ID" NUMBER(19) NOT NULL ,"NAME" VARCHAR2(255 BYTE) ,"CREATETIME" DATE ,"SCORE" NUMBER ,"CLASSID" VARCHAR2(255 BYTE) )INSERT I…

oracle listagg支持,PostgreSQL行列转换(兼容oracle listagg)

oracle11g开始支持的listagg函数替代了wmconcat来实现行列转换的功能。 listagg函数的用法: oracle行列转换例子: —建表https://www.cndba.cn/foucus/article/3929https://www.cndba.cn/foucus/article/3929 SQL> create table b (id number,name varchar2(20)); Table c…

mysql listagg函数_SQLSERVER中的ListAGG

跃然一笑 MySQLSELECT FieldA , GROUP_CONCAT(FieldB ORDER BY FieldB SEPARATOR ,) AS FieldBs FROM TableName GROUP BY FieldA ORDER BY FieldA;Oracle&DB2SELECT FieldA , LISTAGG(FieldB, ,) WITHIN GROUP (ORDER BY FieldB) AS FieldBs FROM TableName GRO…

mysql listagg within_Oracle函数之LISTAGG

最近在学习的过程中&#xff0c;发现一个挺有意思的Oracle函数&#xff0c;它可实现对列值的拼接。下面我们来看看其具体用法。 最近在学习的过程中&#xff0c;发现一个挺有意思的Oracle函数&#xff0c;它可实现对列值的拼接。下面我们来看看其具体用法。 用法&#xff1a; 对…

listagg

1.创建数据表&#xff0c;准备测试数据 CREATE TABLE MK_STUDENT(ID NUMBER(18) NOT NULL,STU_NAME VARCHAR2(200),STU_SCORE VARCHAR2(50),PRIMARY KEY (ID) ); ALTER TABLE MK_STUDENT ADD KEMU VARCHAR2(200);INSERT INTO MK_STUDENT (ID,STU_NAME,STU_SCORE,KEMU) VALUES …

listagg( )详解

想象一个场景&#xff0c;现实生活中一个人有许多手机号已是常态&#xff0c;数据库中也会有类似的结构。 大家肯定想知道listagg()有什么样的效果&#xff1a; 案列分析 一个表中有许多数据&#xff0c;名字叫张三的有许多手机号。希望查询结果出来是分组且清晰。 select …

Oracle列转行函数 Listagg()详解

详解 listagg()函数可以实现多列记录聚合为一条记录&#xff0c;从而实现数据的压缩、致密化&#xff08;data densification&#xff09; 基本用法 像聚合函数一样&#xff0c;通过Group by语句&#xff0c;把每个Group的一个字段&#xff0c;拼接起来 LISTAGG(XXX,XXX) WI…

Oracle 中 LISTAGG 函数的介绍以及使用

LISTAGG 函数介绍 listagg 函数是 Oracle 11.2 推出的新特性。 其主要功能类似于 wmsys.wm_concat 函数&#xff0c; 即将数据分组后&#xff0c; 把指定列的数据再通过指定符号合并。LISTAGG 使用 listagg 函数有两个参数&#xff1a;1、 要合并的列名2、 自定义连接符号☆L…

矩阵乘以其矩阵转置求导-数学

20210703 矩阵论 https://zhuanlan.zhihu.com/p/288541909?utm_sourcewechat_session 矩阵运算法则 20210529 https://blog.csdn.net/Lisa_Ren_123/article/details/81983785 矩阵转置求导 https://jingyan.baidu.com/article/da1091fb69f0b7027849d612.html

matlab中怎么求矩阵的转置

第一步我们首先需要知道matlab中矩阵后面加单引号是共轭转置&#xff0c;加点和单引号是转置&#xff0c;如下图所示&#xff1a; matlab中怎么求矩阵的转置 第二步在matlab命令行窗口中输入“ A[1 2 4;5 6 7]”&#xff0c;如下图所示&#xff1a; matlab中怎么求矩阵的转…

矩阵的转置等于矩阵的逆

http://zhidao.baidu.com/question/334500638.html 百度知道三个回答 矩阵A的转置矩阵A^T等于A的逆矩阵A^-1 那么AA^TAA^-1E 设A(α1&#xff0c;α2&#xff0c;α3&#xff0c;...&#xff0c;αn)^T&#xff0c;其中αi为n维列向量&#xff0c; 那么A^T(α1&#xff0c;α2&…

矩阵转置运算简单总结

矩阵转置的运算规律&#xff1a; &#xff08;1&#xff09;; &#xff08;2&#xff09;; &#xff08;3&#xff09;; &#xff08;4&#xff09;; &#xff08;5&#xff09;

矩阵的转置

稀疏矩阵&#xff1a; 当一个矩阵中的很多元素都是零&#xff0c;而且非零元素的分布没有规律时&#xff0c;该矩阵称为稀疏矩阵。 稀疏矩阵的压缩存储方法&#xff1a; 从稀疏矩阵的概念&#xff0c;我们可以知道&#xff0c;稀疏矩阵的大多元素都是零。所以&#xff0c;我们只…

转置矩阵,逆矩阵和倒转置矩阵

单位矩阵&#xff1a; 转置矩阵(transpose matrix) 在线性代数中&#xff0c;矩阵A的转置是另一个矩阵AT&#xff08;也写做Atr, tA或A′&#xff09;由下列等价动作建立: 把A的横行写为AT的纵列把A的纵列写为AT的横行 形式上说&#xff0c;m n矩阵A的转置是n m矩阵 for 。…

矩阵的乘法和转置

矩阵的乘法 矩阵的转置 A的转置为 ​​​​​​​ 反对称矩阵主对角线上全为0&#xff1b;

矩阵与转置

1.转置矩阵 1.1转置矩阵简介 把矩阵A的行换成同序数的列得到的新矩阵&#xff0c;叫做A的转置矩阵(Transpose of a Matrix)&#xff0c;记作ATAT。 例如&#xff1a; 因此&#xff0c;转置矩阵的特点&#xff1a; &#xff08;1&#xff09;转置矩阵的行数是原矩阵的列数&…

矩阵转置

矩阵转置 1. n*n 对角线置换 #include <stdio.h> //编写函数&#xff1a;实现4*4矩阵的转置。 //要求&#xff1a;在main函数中定义二维数组、输入数据、输出原矩阵、调用函数、输出转置后的矩阵。 int ZhuanZhi(int arr[][4]){int temp;for(int i0;i<4;i){ for(int …

矩阵乘以它的转置

矩阵乘以它的转置 AA^T| |A| |A^T| |A||A| |A|^2即矩阵A乘以A的转置等于A的行列式的平方。 明显不等于啦&#xff0c;1*2的矩阵转置矩阵为2*1&#xff0c;那么1*2的矩阵乘以2*1的转置矩阵得到一个1*1的矩阵&#xff0c;而2*1的转置矩阵乘以1*2的矩阵得到一个2*2的矩阵 这个…