[英]Aggregate and concatenate strings without duplication
我想聚合字符串並連接它們。 這是我正在使用的示例
SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 CLARK, CLARK,KING,MILLER, MILLER
20 ADAMS, ADAMS, ADAMS, FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,MARTIN,TURNER,WARD
3 rows selected.
但是我希望結果在串聯字符串中不重復。
所需結果:
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 CLARK,KING,MILLER
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
3 rows selected.
編輯:所以在下面的示例中有一些“用逗號分隔的員工姓名”。 它使用帶有正則表達式的建議答案:
with emp as (
select 10 as deptno, 'clark,1' as ename from dual
union all
select 10, 'clark,1' from dual
union all
select 10, 'clark,1' from dual
union all
select 10, 'bob' from dual
union all
select 10, 'bob' from dual
union all
select 10, 'don' from dual
union all
select 20, 'tim,2' from dual
union all
select 20, 'tim,2' from dual
union all
select 20, 'tim,2' from dual
union all
select 20, 'jack' from dual
union all
select 20, 'mark' from dual
)
SELECT e.deptno, --LISTAGG(e.ename, ',') WITHIN GROUP (ORDER BY e.ename) AS employees,
RTRIM(REGEXP_REPLACE(listagg (e.ename, ',')
WITHIN GROUP (ORDER BY e.ename),
'([^,]+)(,\1)+', '\1'),
',') AS employees
FROM emp e
GROUP BY e.deptno;
該查詢的結果不正確:
更換
FROM emp
同
FROM (SELECT DISTINCT deptno, ename FROM emp)
(來自非Oracle用戶,但應該可以)
您可以使用REGEX:
SELECT deptno,
rtrim( regexp_replace( (Listagg(ename,',') within GROUP (ORDER BY ename) OVER ()), '([^-]*)(-\1)+($|-)', '\1\3'), '-') within GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
這是使用交叉連接的方法
SELECT DISTINCT deptno,
b.enames
FROM emp a
cross join (SELECT Listagg(ename, '-')
within GROUP (ORDER BY ename) enames
FROM (SELECT DISTINCT enam ename
FROM emp)) b
讓我知道他們是否工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.