说我有一张包含以下数据的表:
您可以看到列a,b和& c有很多裁员。我希望在保留site_id信息的同时删除这些冗余。如果我从查询中排除site_id列,我可以通过执行SELECT DISTINCT a, b, c from my_table
来获取部分内容。
什么是理想的SQL查询可以将与/ b / c的排列相关的站点ID转换为分隔列表,并输出如下内容:
是否可以使用SQL查询执行此操作?或者我是否必须导出所有内容并使用其他工具来删除冗余?
数据在SQL Server数据库中,但如果过程不同,我也很好奇如何使用postgres做同样的事情。
答案 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)