在Oracle 中連接和分組行:重新審視行操作和聚合技術
在資料操作和聚合領域,Oracle 提供了一種多功能的一組能夠有效處理大型資料集的函數。一項常見任務涉及連接和分組多行以實現所需的結果。
考慮以下場景:給定一個包含NAME 和GROUP_NAME 列的表,您的目標是將資料轉換為一個新表,其中行根據GROUP_NAME 上的值和相應的NAME 值在每個組內串聯起來。
此任務的一種方法是利用SYS_CONNECT_BY_PATH 函數,如提供的 SQL 語句中所示。這種方法透過連接每個組內的行值來迭代地建立一個串聯字串。
但是,對於更進階的場景,LISTAGG 函數提供了複雜的解決方案。 Oracle 11g 及更高版本中支援 LISTAGG,它允許對每個群組內的值進行高效聚合,並使用指定的分隔符號(例如逗號)分隔它們。
SELECT group_name, LISTAGG(name, ', ') WITHIN GROUP (ORDER BY GROUP) "names" FROM name_table GROUP BY group_name
對於缺少LISTAGG 的早期版本的Oracle,請考慮利用ROW_NUMBER 和SYS_CONNECT_BY_PATH 等分析函數來實現行串聯
select grp, ltrim(max(sys_connect_by_path (name, ',' )), ',') scbp from (select name, grp, row_number() over (partition by grp order by name) rn from tab ) start with rn = 1 connect by prior rn = rn-1 and prior grp = grp group by grp order by grp
透過探索這些技術,您可以在Oracle 中有效地串聯和分組行,輕鬆處理複雜的資料操作和聚合需求。
以上是如何在 Oracle 中有效率地連接和分組行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!