Sql Postgres删除具有相同ID的多行
我有一个简单的表,带有一个ID和一些空格分隔的段:Sql Postgres删除具有相同ID的多行,sql,postgresql,Sql,Postgresql,我有一个简单的表,带有一个ID和一些空格分隔的段: id | segments -------------------------------+----------------------- 2A3A3362051D43-6000014002B3C4 | 73024 73025 2A399D20051D96-4000010002782A | 96878 92779 73024 73025 2A3747D3051DE0-400001
id | segments
-------------------------------+-----------------------
2A3A3362051D43-6000014002B3C4 | 73024 73025
2A399D20051D96-4000010002782A | 96878 92779 73024 73025
2A3747D3051DE0-40000100032E40 | 139313
29C1D823851DDF-400001200FD641 | 139313
问题是,其中一些ID重复:
id | segments
-------------------------------+--------------------------
27295CD0851AB2-400000E01059BF | 139313
27295CD0851AB2-400000E01059BF | 139313
27295CD0851AB2-400000E01059BF | 139313 92779 73024 73025
27295CD0851AB2-400000E01059BF | 139313
27295CD0851AB2-400000E01059BF | 139313
问题是如何删除不必要的行,每个ID只保留一行,同时保留所有段(它们是随机的,我必须保留每一行),段存储为文本,因此简单的字符串连接将起作用。这是一种非常糟糕的数据格式。您应该有一个单独的表,每个id和每个段有一行。将事物列表存储在单独的列表中并没有充分利用关系数据库。将数值存储为字符串更糟糕 这就是说,有时您会被特定格式的数据所困扰。您可以取消字符串的测试,获取不同的值,然后重新聚合以执行所需的操作:
select id, string_agg(segment, ' ')
from (select distinct id, unnest(string_to_array(segments, ' ')) as segment
from t
) t
group by id;
假设您有一个简单的文本列:
SELECT id, string_agg(DISTINCT seg) AS segments
FROM tbl
, unnest(string_to_array(segments, ' ')) seg
GROUP BY 1;
在第9.3页中,与其调用选择
列表中的集合返回函数,不如使用横向
连接。有关答案及详情:
考虑您的表布局。您的表定义(
\d tbl
在psql中)?你对博士后的看法?在段中合并数组(我想)可以吗?我同意这是一种糟糕的格式,但这是我必须处理的。您的解决方案有效,谢谢!