拆分和合并列中唯一的 SQL 逗号分隔值,然后分组

Posted

技术标签:

【中文标题】拆分和合并列中唯一的 SQL 逗号分隔值,然后分组【英文标题】:Split and Concat Unique SQL comma separated values in column, and then group by 【发布时间】:2020-10-23 21:11:35 【问题描述】:

我正在尝试编写一个 SQL 查询,以帮助我找出特定列中出现的唯一数量的“数字”。例如,在一个 select * 查询中,我想要的列可以是这样的

Num_Option
9000
9001
9000,9001,9002
8080
8080,8000,8553

然后我有另一个“date_available”字段,它是一个日期/时间。

基本上,我想要的是我可以按“date_available”分组的东西,同时结合该日期的所有 Num_Options,所以像这样..

Num_Option                        date_available
9000,9001,9002,8080                 10/22/2020
9000,9002,8080,8000,8553            10/23/2020

我正在努力解决这个问题。我已经达到了使用 python 脚本和 matplotlib 代替的可能点......但我希望也有一种 SQL 方式来处理这个问题。

【问题讨论】:

Redshift 还是 Postgres?虽然它们有一些古老的根源,但它们却截然不同 【参考方案1】:

在 Postgres 中,您可以在横向连接中使用 regexp_split_to_table() 将 csv 元素转换为行,然后使用 string_agg() 按日期聚合:

select string_agg(x.num, ',') num_option, t.date_available
from mytable t
cross join lateral regexp_split_to_table(t.num_option, ',') x(num)
group by date_available

当然,这里假设你想避免在同一数据上出现重复的nums(否则不需要拆分,直接聚合即可)。

【讨论】:

嗯,我正在这样做并收到错误 SELECT string_agg(x.num, ',') num_option, date_available from team.metric_data cross join lateral regexp_split_to_table(num_option, ',') x(num) group by date_available cross join lateral regexp_split_to_table(num_option, ',') x(num) ^ 1 statement failed. 它指向 ',' 之前的逗号/空格 实际上,这对我来说似乎是一个硬块,我想我让它工作了,但是由于数据大于 65535,它达到了硬限制。因此,可能需要以不同的方式获取这些数据。【参考方案2】:

你也许可以使用string_agg():

select date_available, string_agg(num_option, ',')
from t
group by date_available;

【讨论】:

他想要唯一数量的数字,所以必须先转换成表格 @astentx 。 . .这是有道理的,但样本数据并不能说明这是否必要。【参考方案3】:

首先,您必须使用split_part('9000,9001,9002',',',1) 等将字符串拆分为多行(使用UNION ALL 附加第二个数字等),然后使用string_agg 将它们按可用性日期分组

如果您不想硬编码 split_part 部分,这里有关于如何在 Redshift 中动态拆分字符串的答案,请查找它

【讨论】:

以上是关于拆分和合并列中唯一的 SQL 逗号分隔值,然后分组的主要内容,如果未能解决你的问题,请参考以下文章

在SQL过程中将一列中的逗号分隔值拆分为多列

SQL 内连接和分组依据以获取逗号分隔值

sql 将逗号分隔的字符串拆分为值列表(返回游标)

获取 Sql-Server 中逗号分隔值中未分组列的详细信息

sql 分组,然后用逗号分隔

SQL拆分逗号分隔的字符串