oracle listagg 结果太长

oracle listagg the outcome is too long

我正在使用 listagg() 聚合字符串值

比如有一个table是这样的:

Table1
Name     Rank
Bob      A
Bob      B
Bob      C
Tom      A
Tom      C
SELECT Name,LISTAGG(RANK,';') WITHIN GROUP (ORDER BY RANK) AS COMRANK 
FROM Table1

我们得到结果:

Name  COMRANK
Bob   ABC
Tom   AC

如果 COMRANK 变得太长怎么办?我可以在聚合它们之前找到 top xxx 吗?

您可以使用 window 函数对行进行排名,并将行限制为您需要的任何排名。

SELECT Name,LISTAGG(RANK,';') WITHIN GROUP (ORDER BY RANK) AS COMRANK 
FROM (select
    name, rank,
    rank() over (partition by name order by rank) rnk
  from Table1
) where rnk < 10; --some value
GROUP BY Name;