在 SQL Server 的 STRING_AGG 函数中处理重复值
SQL Server 2017 中引入的 STRING_AGG 函数将列值连接成单个字符串。 但是,它本身并不能删除重复项。 本文详细介绍了在聚合字符串中实现不同值的两步方法。
两步解决方案
关键是使用 STRING_AGG 之前执行不同的操作。这涉及两个阶段的分组过程:
对不同值进行初始分组: 首先,按您希望唯一的列以及最终结果所需的任何其他必要列对数据进行分组。 这会删除源中的重复行。
<code class="language-sql">WITH Sitings AS ( SELECT * FROM (VALUES (1, 'Florida', 'Orlando', 'bird'), (2, 'Florida', 'Orlando', 'dog'), (3, 'Arizona', 'Phoenix', 'bird'), (4, 'Arizona', 'Phoenix', 'dog'), (5, 'Arizona', 'Phoenix', 'bird'), (6, 'Arizona', 'Phoenix', 'bird'), (7, 'Arizona', 'Phoenix', 'bird'), (8, 'Arizona', 'Flagstaff', 'dog') ) F (ID, State, City, Siting) ), CTE_Animals AS ( SELECT State, City, Siting FROM Sitings GROUP BY State, City, Siting )</code>
最终分组和聚合:接下来,按所需列对第一步的结果进行分组,并应用 STRING_AGG 连接不同的值。
<code class="language-sql">SELECT State, City, COUNT(1) AS [# Of Sitings], STRING_AGG(Siting,',') AS Animals FROM CTE_Animals GROUP BY State, City ORDER BY State, City;</code>
关于字符串长度的重要说明:
如果您的连接字符串可能超过 VARCHAR 的 8000 个字符限制,请在使用 VARCHAR(MAX)
之前将值转换为 STRING_AGG
:
<code class="language-sql">STRING_AGG(CAST(Siting AS VARCHAR(MAX)), ',') AS Animals</code>
此方法有效地生成仅包含唯一值的 STRING_AGG
结果。
以上是如何从 SQL Server 中的 STRING_AGG 输出中删除重复值?的详细内容。更多信息请关注PHP中文网其他相关文章!