繁体   English   中英

SQL使用listagg()并按非重复值分组

[英]SQL using listagg() and group by non duplicated values

        ID TELNO
---------- --------------------
         1 0123456789
         1 0207983498
         2 0124339848
         2 09348374834
         2 02387694364

我如何查询上表以获取如下输出:

        ID TEL_LIST
---------- --------------------
         1 0123456789,0207983498
         2 0124339848,09348374834,09348374834 

我知道我可以使用listagg()通过对列进行分组来连接ID。 例如,

组(按ID排序)内的listagg(id',')作为idList

将返回1,2。

但是,TELNO列无法分组,并且值通常是唯一的。 在无法进行分组依据的第二列上如何进行串联?

查询:

SQLFIDDLEEXAMPLE

SELECT 
ID, LISTAGG(TELNO, ', ') 
WITHIN GROUP (ORDER BY TELNO) 
AS TEL_LIST
FROM   tbl
GROUP BY ID;

结果:

| ID |                             TEL_LIST |
---------------------------------------------
|  1 |               0123456789, 0207983498 |
|  2 | 0124339848, 02387694364, 09348374834 |

我不知道您是否对ID,TELNO设置了唯一性约束。如果没有,我们需要首先从表中过滤唯一性值,然后应用LISTAGG ,如下所示:

  SELECT ID,
       LISTAGG(TELNO, ',') WITHIN GROUP (ORDER BY ID) AS TELNO
  FROM (
       SELECT UNIQUE
              ID,
              TELNO
         FROM tbl
       )
  GROUP BY ID;

SQLFIDDLE: 链接

如果查看execution place or the trace file ,则在同一组数据上的成本将相同,在上述解决方案中建议使用查询JUSTIN

您可以使用wm_concat()函数执行相同的操作。

 select id,wm_concat(telno) from my_table group by id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM