SQL Server 的 STRING_AGG
功能:删除重复值
本文解决了在 SQL Server 2017 及更高版本中消除 STRING_AGG
函数中的重复值的挑战。 标准 STRING_AGG
函数不直接支持 DISTINCT
关键字进行唯一值聚合。
问题:直接使用 DISTINCT
和 STRING_AGG
来计算和连接唯一值是不可能的。
目标: 使用 STRING_AGG
.
示例:
让我们考虑一个包含 Sitings
、State
和 City
列的 Siting
表:
<code>ID | State | City | Siting --------------------------------- 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</code>
使用 COUNT(DISTINCT Siting)
和 STRING_AGG(Siting, ',')
的简单查询会产生:
State | City | # Of Types | Animals |
---|---|---|---|
Arizona | Flagstaff | 1 | dog |
Florida | Orlando | 2 | dog,bird |
Arizona | Phoenix | 2 | bird,bird,bird,dog,bird |
但是,所需的输出应该从 Phoenix 的“动物”列中删除重复项:
State | City | # Of Types | Animals |
---|---|---|---|
Arizona | Flagstaff | 1 | dog |
Florida | Orlando | 2 | dog,bird |
Arizona | Phoenix | 2 | bird,dog |
解决方案:双重分组方法
为了实现这一目标,我们利用通用表表达式 (CTE) 进行两步分组过程:
<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') ) AS F (ID, State, City, Siting) ), CTE_Animals AS ( SELECT State, City, Siting FROM Sitings GROUP BY State, City, Siting ) 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>
结果:此查询成功生成所需的输出:
State | City | # Of Sitings | Animals |
---|---|---|---|
Arizona | Flagstaff | 1 | dog |
Arizona | Phoenix | 2 | bird,dog |
Florida | Orlando | 2 | dog,bird |
这种双分组技术首先按 State
、City
和 Siting
进行分组,以消除每个城市内的重复项,然后再次按 State
和 City
进行分组以连接唯一的地点。
以上是如何消除 SQL Server STRING_AGG 函数中的重复项?的详细内容。更多信息请关注PHP中文网其他相关文章!