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中文网其他相关文章!