在 SQL Server 中使用 STRING_AGG 获取唯一值

新手上路,请多包涵

以下查询返回如下所示的结果:

 SELECT
    ProjectID, newID.value
FROM
    [dbo].[Data] WITH(NOLOCK)
CROSS APPLY
    STRING_SPLIT([bID],';') AS newID
WHERE
    newID.value IN ('O95833', 'Q96NY7-2')

结果:

 ProjectID   value
---------------------
2           Q96NY7-2
2           O95833
2           O95833
2           Q96NY7-2
2           O95833
2           Q96NY7-2
4           Q96NY7-2
4           Q96NY7-2

使用新添加的 STRING_AGG 函数(在 SQL Server 2017 中),如以下查询所示,我可以获得下面的结果集。

 SELECT
    ProjectID,
    STRING_AGG( newID.value, ',') WITHIN GROUP (ORDER BY newID.value) AS
NewField
FROM
    [dbo].[Data] WITH(NOLOCK)
CROSS APPLY
    STRING_SPLIT([bID],';') AS newID
WHERE
    newID.value IN ('O95833', 'Q96NY7-2')
GROUP BY
    ProjectID
ORDER BY
    ProjectID

结果:

 ProjectID   NewField
-------------------------------------------------------------
2           O95833,O95833,O95833,Q96NY7-2,Q96NY7-2,Q96NY7-2
4           Q96NY7-2,Q96NY7-2

我希望我的最终输出只有独特的元素,如下所示:

 ProjectID   NewField
-------------------------------
2           O95833, Q96NY7-2
4           Q96NY7-2

有关如何获得此结果的任何建议?如果需要,请随时从头开始完善/重新设计我的查询。

原文由 gkoul 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

在合并结果之前,在子查询中使用 DISTINCT 关键字删除重复项: SQL Fiddle

 SELECT
ProjectID
,STRING_AGG(value, ',') WITHIN GROUP (ORDER BY value) AS
NewField
from (
    select distinct ProjectId, newId.value
    FROM [dbo].[Data] WITH(NOLOCK)
    CROSS APPLY STRING_SPLIT([bID],';') AS newID
    WHERE newID.value IN (   'O95833' , 'Q96NY7-2'  )
) x
GROUP BY ProjectID
ORDER BY ProjectID

原文由 JohnLBevan 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是我对@ttugates 的改进,使其更通用:

 CREATE OR ALTER FUNCTION [dbo].[fn_DistinctList]
(
  @String NVARCHAR(MAX),
  @Delimiter char(1)
)
RETURNS NVARCHAR(MAX)
WITH SCHEMABINDING
AS
BEGIN
  DECLARE @Result NVARCHAR(MAX);
  WITH MY_CTE AS ( SELECT Distinct(value) FROM STRING_SPLIT(@String,
@Delimiter)  )
  SELECT @Result = STRING_AGG(value, @Delimiter) FROM MY_CTE
  RETURN @Result
END

原文由 Domagoj Peharda 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进