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中文網其他相關文章!