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

SQL-将关系ID转换为分隔列表,sql,sql-server,postgresql,Sql,Sql Server,Postgresql,假设我有一个包含以下数据的表: 您可以看到列a、b和c有很多冗余。我希望在保留站点id信息的同时删除这些冗余。如果我从查询中排除site\u id列,我可以通过执行从我的\u表中选择不同的a、b、c来部分实现 理想的SQL查询可以将与a/b/c排列相关的站点ID转换为分隔列表,并输出如下内容: 是否可以通过SQL查询实现这一点?或者我必须导出所有内容并使用不同的工具来删除冗余 数据位于SQL Server数据库中,但如果过程不同,我也很好奇如何对postgres执行相同的操作。这通常称为字符

假设我有一个包含以下数据的表:

您可以看到列a、b和c有很多冗余。我希望在保留站点id信息的同时删除这些冗余。如果我从查询中排除site\u id列,我可以通过执行
从我的\u表中选择不同的a、b、c来部分实现

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

是否可以通过SQL查询实现这一点?或者我必须导出所有内容并使用不同的工具来删除冗余


数据位于SQL Server数据库中,但如果过程不同,我也很好奇如何对postgres执行相同的操作。

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

在Postgres中,您只需使用
STRING\u AGG(,)
函数,并确保为非聚合字段添加GROUP BY。简单的东西


在SQL Server中。。不是很漂亮,但是人们有函数和其他什么可以让你做到这一点()

对于SQL Server,你可以使用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
对于博士后:

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

我假设
site\u id
是一个数字,由于
string\u agg()
只接受字符值,因此需要将其转换为字符串以进行聚合。这就是
site\u id::text
所做的。或者,您可以使用
cast()
运算符:
string\u agg(cast(site\u id为varchar),,)

对于MSSQL,您有,对于PostgreSQL,您有,但取决于版本不同的方法。别忘了搜索是你的朋友;)我知道一个简单的方法是SQL,但不确定postgres。这里有一种使用SQLServerWow的方法,我觉得我想做的有点奇怪(搜索的时候运气不太好)。。。显然,这并不是那么不寻常。我只是在找错东西。谢谢大家!