我正在编写一个查询,似乎无法克服这一障碍。
我在其中同时使用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时,我该如何实现?
答案 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;