我有这样的桌子:
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
呼叫中的唯一性过滤名称?
SELECT group_id,
LISTAGG(name, ',') WITHIN GROUP (ORDER BY name) AS names
FROM (
SELECT UNIQUE
group_id,
name
FROM demotable
)
GROUP BY group_id
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
select group_id,
listagg(name, ',') within group (order by name) as names
over (partition by group_id)
from demotable
group by group_id
select wm_concat(distinct name) as names from demotable group by group_id
i我需要在基于最外部查询的汇总之前,用一些数据过滤器作为子查询,但我无法使用所选的答案代码来执行此操作)并且过滤器参数位于最外部选择(第一级查询)中,这给了我错误
ora-00904:“ tb_outermast”。“ col”:无效的识别符,为ANSI SQL表示该表参考(相关名称)被范围深入到一个级别。
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;
select wm_concat(distinct name) as names from demotable group by group_id