Listagg +选择重复项中的计数

时间:2019-07-26 14:20:56

标签: sql oracle count listagg

我正在编写一个查询,似乎无法克服这一障碍。

我在其中同时使用LISTAGG和COUNT(并排),并且每次使用时,如果count大于1,则ListAgg将重复。此外,如果ListAgg大于一。它们彼此之间是一团糟,我想知道如何将它们保留在同一查询中,但是要避免重复项出现在ListAgg中,而只为Count找到正确数量的实例。

我尝试使用DISTINCT和各种分组,但无济于事。

这是我的(简化的)SQL:

SELECT DISTINCT /*+PARALLEL */ ID, NAME, LISTAGG(USERID, ';'), COUNT(MAIN_DATA)

FROM MAIN m
JOIN USERS u on m.pk1 = u.main_pk1

WHERE MAIN_DATA like '%keyword%'
GROUP BY ID, NAME

产生类似于以下内容的

ID|NAME|USERID|MAIN_DATA

1|Hello|Jim|1
2|Hi|Arthur;Arthur;Arthur|3
3|Bonjour|Jane;Jane;Jim;Jim|4

当ID 2只能有一次亚瑟,并且ID 3中只有2个关键字实例,而不是4时,我该如何实现?

1 个答案:

答案 0 :(得分:2)

很遗憾,LISTAGG()不支持DISTINCT

要删除重复项,您需要一个子查询:

SELECT ID, NAME, LISTAGG(USERID, ';'), SUM(cnt)
FROM (SELECT ID, NAME, USERID, COUNT(*) as cnt
      FROM MAIN m JOIN
           USERS u 
           ON m.pk1 = u.main_pk1
      WHERE m.MAIN_DATA like '%keyword%'
      GROUP BY ID, NAME, USERID
     ) mu
GROUP BY ID, NAME;