SQL - 将关系ID转换为分隔列表

时间:2016-01-14 21:00:34

标签: sql sql-server postgresql

说我有一张包含以下数据的表:

example data

您可以看到列a,b和& c有很多裁员。我希望在保留site_id信息的同时删除这些冗余。如果我从查询中排除site_id列,我可以通过执行SELECT DISTINCT a, b, c from my_table来获取部分内容。

什么是理想的SQL查询可以将与/ b / c的排列相关的站点ID转换为分隔列表,并输出如下内容:

desired output

是否可以使用SQL查询执行此操作?或者我是否必须导出所有内容并使用其他工具来删除冗余?

数据在SQL Server数据库中,但如果过程不同,我也很好奇如何使用postgres做同样的事情。

3 个答案:

答案 0 :(得分:1)

对于SQL Server,您可以使用this帖子中接受的答案中的FOR XML技巧。

对于您的场景,它看起来像这样:

SELECT a, b, c,  SiteIds = 
    STUFF((SELECT ', ' + SiteId
           FROM your_table t2 
           WHERE t2.a = t1.a AND t2.b = t1.b AND t2.c = t1.c
          FOR XML PATH('')), 1, 2, '')
FROM your_table t1
GROUP BY a, b, c

答案 1 :(得分:1)

对于Postgres:

select a,b,c, string_agg(site_id::varchar, ',')
from my_table
group by a,b,b;

我假设site_id是一个数字,而string_agg()只接受字符值,这需要转换为聚合的字符串。这就是site_id::text的作用。或者,您可以使用cast()运算符:string_agg(cast(site_id as varchar), ',')

答案 2 :(得分:0)

这通常称为字符串聚合。许多RDBMS都有能力,而其他许多人都没有。

在Postgres中,您只需使用STRING_AGG(<field>, <delimiter>)函数,并确保为非聚合字段添加GROUP BY。简单的东西。

在SQL Server中..不是那么漂亮,但人们有功能和诸如此类的东西可以让你这样做(like in this Q/A