呃。我不喜歡把它寫成答案,但我發現Oracle-Base(請參閱Alex Poole的評論)和William Robertson的網站(引用Oracle-Base文章)中的解決方案並不完美,將不適合評論。
Oracle的基本環節:https://oracle-base.com/articles/misc/string-aggregation-techniques#row_number 威廉·羅伯遜網站:http://www.williamrobertson.net/documents/one-row.html
在甲骨文基本的解決方案使用兩個調用row_number()
只需要一個時,它使用匯總查詢,而不是connect_by_isleaf
。也許這是William最初發布的解決方案,但他的頁面目前有更好的解決方案,只需使用一個row_number()
調用和connect_by_isleaf
而不是聚合。
但是,在William的頁面上,他使用ltrim()
而沒有顯示要修剪哪個字符的參數,所以實際上它沒有效果。並且他從row_number()
的值中減去1,所以在結果中,每個逗號分隔列表中的第一個標記被省略。
這裏是更正的解決方案 - 供參考;我聲稱對此沒有任何獨創性。插圖在標準SCOTT
模式的EMP
表中運行。
select deptno
, ltrim(sys_connect_by_path(ename,','), ',') as name_list
from (select deptno
, ename
, row_number() over (partition by deptno order by ename) as seq
from emp)
where connect_by_isleaf = 1
connect by seq = prior seq + 1 and deptno = prior deptno
start with seq = 1;
DEPTNO NAME_LIST
------ ------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
[各種技術顯示在這裏](https://oracle-base.com/articles/misc/string-aggregation-techniques)。 'sys_connect_by_path'可能是一個開始的地方,因爲你已經對它們進行了排名。 –
謝謝。我已經看到這個,但LISTAGG,wm_concat和COLLECT沒有啓用,我沒有權限寫自己的函數。 好的:也許我可以讓sys_connect_by_path工作 – delica
@delica這是要進入OBIEE的直接數據庫請求嗎?或者你將嘗試將其加入RPD中? –