Oracle LISTAGG:處理重複值以獲得唯一結果
Oracle 的 LISTAGG 函數雖然對於聚合資料功能強大,但本質上並不能刪除重複的條目。 它將所有值(包括重複值)連接成一個字串。 以下是如何實現不同值聚合:
Oracle 19c 及更高版本的方法:
Oracle 19c 及更高版本提供了簡化的解決方案:
<code class="language-sql">SELECT LISTAGG(DISTINCT the_column, ',') WITHIN GROUP (ORDER BY the_column) FROM the_table;</code>
這直接將 DISTINCT
關鍵字合併到 LISTAGG
函數本身。
Oracle 18c 及更早版本的方法:
對於舊版(18c 及以下),需要子查詢:
<code class="language-sql">SELECT LISTAGG(the_column, ',') WITHIN GROUP (ORDER BY the_column) FROM ( SELECT DISTINCT the_column FROM the_table ) t;</code>
這首先只選擇子查詢中的唯一值,然後將 LISTAGG
套用到該結果。
包含多列:
要包含額外的列並保持唯一性,需要更高級的方法:
<code class="language-sql">SELECT col1, LISTAGG(col2, ',') WITHIN GROUP (ORDER BY col2) FROM ( SELECT col1, col2, ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col1) AS rn FROM foo ORDER BY col1, col2 ) WHERE rn = 1 GROUP BY col1;</code>
這使用 ROW_NUMBER()
為 col1
和 col2
的每個組合分配唯一的排名。 然後,外部查詢僅選擇每個唯一組合的第一個符合項目 (rn = 1),確保在聚合之前消除重複項。
以上是使用Oracle的LISTAGG函數如何移除重複項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!