如何将Oracle的ListAgg函数与唯一的过滤器一起使用? [重复]

问题描述 投票:0回答:7

我有这样的桌子:

group_id  name  
--------  ----
1         David
1         John
1         Alan
1         David
2         Julie
2         Charles

我想要以下结果:

group_id  names
--------  -----
1         'Alan, David, John'
2         'Charles, Julie'
我可以使用以下查询:

select group_id, listagg(name, ',') within group (order by name) as names from demotable group by group_id
要获得此(非常相似的结果):

group_id names -------- ----- 1 'Alan, David, David, John' 2 'Charles, Julie'
任何想法,我如何通过

LISTAGG

呼叫中的唯一性过滤名称?
    

oracle-database group-by oracle11g aggregate-functions
7个回答
59
投票

SELECT group_id, LISTAGG(name, ',') WITHIN GROUP (ORDER BY name) AS names FROM ( SELECT UNIQUE group_id, name FROM demotable ) GROUP BY group_id


super简单答案 - 解决!

18
投票
我的完整答案

here

现在它在某些Oracle版本中内置。

select group_id, regexp_replace( listagg(name, ',') within group (order by name) ,'([^,]+)(,\1)*(,|$)', '\1\3') from demotable group by group_id; 当您将定界符指定为','不','ie时,这仅在 逗号之后,仅适用于没有空间。如果您想要逗号之后的空格 - 这是一个例子。

select replace( regexp_replace( regexp_replace('BBall, BBall, BBall, Football, Ice Hockey ',',\s*',',') ,'([^,]+)(,\1)*(,|$)', '\1\3') ,',',', ') from dual
Gives 
B骨,足球,冰球

create table demotable(group_id number, name varchar2(100));
insert into demotable values(1,'David');
insert into demotable values(1,'John');
insert into demotable values(1,'Alan');
insert into demotable values(1,'David');
insert into demotable values(2,'Julie');
insert into demotable values(2,'Charles');
commit;

select group_id, 
       (select listagg(column_value, ',') within group (order by column_value) from table(coll_names)) as names
from (
  select group_id, collect(distinct name) as coll_names 
    from demotable
    group by group_id 
)

GROUP_ID    NAMES
1   Alan,David,John
2   Charles,Julie


5
投票
select group_id, listagg(name, ',') within group (order by name) as names over (partition by group_id) from demotable group by group_id
    

2
投票
贝洛(Below 并且无法在功能中应用,显示错误:
select wm_concat(distinct name) as names from demotable group by group_id

1
投票

i我需要在基于最外部查询的汇总之前,用一些数据过滤器作为子查询,但我无法使用所选的答案代码来执行此操作)并且过滤器参数位于最外部选择(第一级查询)中,这给了我错误
ora-00904:“ tb_outermast”。“ col”:无效的识别符,为ANSI SQL表示该表参考(相关名称)被范围深入到一个级别。 

0
投票

with demotable as ( select 1 group_id, 'David' name from dual union all select 1 group_id, 'John' name from dual union all select 1 group_id, 'Alan' name from dual union all select 1 group_id, 'David' name from dual union all select 2 group_id, 'Julie' name from dual union all select 2 group_id, 'Charlie' name from dual ) select distinct group_id, listagg(name, ',') within group (order by name) over (partition by group_id) names from demotable -- where any filter I want group by group_id, name order by group_id;

11G您可以使用无证件的函数WM_Concat:

select wm_concat(distinct name) as names from demotable group by group_id
    

-2
投票
© www.soinside.com 2019 - 2024. All rights reserved.