고유한 필터와 함께 Oracle의 LISTAGG 함수를 사용하는 방법은 무엇입니까?
제 테이블은 다음과 같습니다.
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
전화할 수 있나요?
현재 사용 가능한 11g 인스턴스는 없습니다만, 다음 항목을 사용할 수 없습니다.
SELECT group_id,
LISTAGG(name, ',') WITHIN GROUP (ORDER BY name) AS names
FROM (
SELECT UNIQUE
group_id,
name
FROM demotable
)
GROUP BY group_id
초간단한 답변 - 해결!
이 모든 답변은 현재 일부 Oracle 버전에 포함되어 있습니다.
select group_id,
regexp_replace(
listagg(name, ',') within group (order by name)
,'([^,]+)(,\1)*(,|$)', '\1\3')
from demotable
group by group_id;
이것은 딜리미터를 쉼표 뒤에 공백이 없는 경우에만 사용할 수 있습니다.쉼표 뒤에 공백이 필요한 경우 - 예를 들어 보겠습니다.
select
replace(
regexp_replace(
regexp_replace('BBall, BBall, BBall, Football, Ice Hockey ',',\s*',',')
,'([^,]+)(,\1)*(,|$)', '\1\3')
,',',', ')
from dual
BBALL, 축구, 아이스하키 제공
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
아래는 문서화되어 있지 않으며 Oracle에서는 권장되지 않습니다.기능상 적용할 수 없습니다.오류 표시
select wm_concat(distinct name) as names from demotable group by group_id
지아에 대하여
외부 쿼리를 기반으로 집계하기 전에 하위 쿼리로 이 코드 평화가 필요했지만 이 필터는 내부 most select(3단계 쿼리)에 들어가고 필터 파라미터는 외부 most select(1단계 쿼리)에 들어가 오류가 발생했기 때문에 선택한 응답 코드를 사용하여 이를 수행할 수 없었습니다.4: "TB_OUTHOST"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;
11g에서는 다음과 같이 문서화되어 있지 않은 함수 wm_concat를 사용할 수 있습니다.
select wm_concat(distinct name) as names from demotable group by group_id
언급URL : https://stackoverflow.com/questions/7355095/how-to-use-oracles-listagg-function-with-a-unique-filter
'programing' 카테고리의 다른 글
워드프레스:첨부 파일 필드 제거 (0) | 2023.03.12 |
---|---|
'필드는 찾을 수 없는 유형의 빈을 필요로 했습니다.' mongodb를 사용한 오류 스프링 restful API입니다. (0) | 2023.03.12 |
'or' 조건을 가진 MongoDB 쿼리 (0) | 2023.03.12 |
큰 리덕스 상태가 애플리케이션의 퍼포먼스에 영향을 미칩니까? (0) | 2023.03.12 |
ui.bootstrap.datepicker가 열려 있고 모드에서 작동하지 않음 (0) | 2023.03.07 |