拆分和合并列中唯一的 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 逗号分隔值,然后分组的主要内容,如果未能解决你的问题,请参考以下文章