从结果列中删除非唯一值

时间:2019-07-12 08:29:27

标签: sql-server aggregate-functions

在我的SQL结果中,我有多行,每行都有一个包含非唯一ID列表的列。

我需要使它们唯一,但是我遇到了麻烦,因为我无法在包含另一个聚合函数的子查询上使用聚合函数。

这是我的简化示例,导致

  

无法对包含以下内容的表达式执行聚合函数   聚合或子查询。

WITH cte_1 AS (
    SELECT  1 AS rownum,
            '1,2,2,3,3,3,4,5,6' as ids
)
SELECT  rownum,
        ids,
        string_agg(
            (
                SELECT DISTINCT value FROM STRING_SPLIT(ids,',')
            ), ',') AS ids2
FROM        cte_1

我宁愿不使用用户定义的函数,但我怀疑我可能必须这样做。

[Edit1]

为清楚起见,以下是示例,但显示了多行:

WITH cte_1 AS (
    SELECT  1 AS rownum,
            '1,2,2,3,3,3,4,5,6' as ids
    UNION ALL
    SELECT  2 AS rownum,
            '1,1,2,2,2,3,5,5,6' as ids
)
SELECT  rownum,
        ids,
        string_agg(
            (
                SELECT DISTINCT value FROM STRING_SPLIT(ids,',')
            ), ',') AS ids2
FROM        cte_1

[Edit2]

为了更加清晰地了解需要它的人,上面的示例公用表表达式包含硬编码值,而实际数据集则没有。

我不会粘贴到产生我的结果集的整个查询中,因为这会很直观。我需要的是一种从结果的一列中删除重复值的方法,这些值实际上不是硬编码的,而是由动态数据产生的。

1 个答案:

答案 0 :(得分:1)

您可以尝试一下。

WITH cte_1 AS (
    SELECT  1 AS rownum,
            '1,2,2,3,3,3,4,5,6' as ids
)
SELECT  rownum,
        ids,
        ( select string_agg(value, ',') ids2 FROM ( SELECT DISTINCT value FROM STRING_SPLIT(ids,',') ) X ) ids2
FROM cte_1