SQL Server の STRING_AGG 関数内の重複値の処理
SQL Server 2017 で導入された SQL Server の STRING_AGG 関数は、列の値を 1 つの文字列に連結します。 ただし、本質的に重複は削除されません。 この記事では、集計された文字列内で個別の値を取得するための 2 段階のアプローチについて詳しく説明します。
2 段階のソリューション
重要なのは、STRING_AGG を使用する 前に個別の操作を実行することです。これには、2 段階のグループ化プロセスが含まれます:
個別値の初期グループ化: まず、最終結果に必要な他の列とともに、一意にする列ごとにデータをグループ化します。 これにより、ソースで重複した行が削除されます。
<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 中国語 Web サイトの他の関連記事を参照してください。