sql - 在 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
有关如何获得此结果的任何建议?如果需要,请随时从头开始完善/重新设计我的查询。
解决方案
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
推荐阅读
- shell - 什么是获取当前日期和日期 3 小时的 shell 命令?
- python - 使用列中的数据创建新列
- python - Python - 用字母等级替换CSV文件中的整数
- c# - 长路径 \\?\ 解决方法不适用于某些安装
- airflow - Apache Airflow 池:已用插槽 > 可用插槽
- redis - 如何在 lua 脚本中从一个列表中 SPOP 和 SADD 到另一个
- javascript - 通过单击表格行的按钮生成带有动态数据的模态弹出窗口
- laravel - Axios FormData 在服务器端为空
- python - NameError:名称“规则”未定义,但我确实导入了规则库
- node.js - Node.JS 将多个图像上传到 AWS S3 Async