Redshift SQL - 反向 Listagg 函数

Posted

技术标签:

【中文标题】Redshift SQL - 反向 Listagg 函数【英文标题】:Redshift SQL - Reverse Listagg function 【发布时间】:2020-04-15 00:24:59 【问题描述】:

假设我有一个如下表:

Name   Order
 AA     1,2
 BB     2,3

我希望我的结果是这样的:

Name   Order
 AA      1
 AA      2
 BB      2
 BB      3

如何在 Redshift 中实现这一点?

谢谢!

【问题讨论】:

订单列的数据类型是什么? @zealous 假设它是字符串(如实际订单号 A1、A2、A3) 【参考方案1】:

假设您事先知道每个分隔列表的最大元素数,您可以使用数字表和split_part()

select t.name, split_part(t.order, ',', n.n) val
from (
    select 1 n
    union all select 2
    union all select 3
) n
inner join mytable t
    on n.n <= regexp_count(t.order, ',') + 1

您可以根据需要使用更多数字扩展派生表n。也可以对大表使用row_number() 来生成数字表。

【讨论】:

谢谢!但是我没有关注那里的子查询 n,以及那里的 regexp_count 的目的。你能解释一下吗? 它基本上是将数据连接到包含计数的表中,然后使用它来选择拆分项目的一部分。这有点作弊,因为这不是创建 SQL 的目的,但它确实有效。

以上是关于Redshift SQL - 反向 Listagg 函数的主要内容,如果未能解决你的问题,请参考以下文章

Listagg Redshift DDL

使用 redshift listagg 函数的语法错误

如何让我的 Amazon Redshift UDF 接收字符串而不是列表?

oracle sql listagg [重复]

使用 LISTAGG 和 CASE 语句的 SQL 查询

Oracle SQL:如何删除 listagg 中的重复项