【问题标题】:How to write a listagg on Redshift?如何在 Redshift 上写一个 listagg?
【发布时间】:2023-04-01 09:22:01
【问题描述】:

如下示例数据,

Col1 Col2
1    A
1    B
1    C
2    A
2    B

我正在寻找的输出是

COL1 COL2
1    A B C
2    A B

这可以在 Oracle 上使用 LISTAGG 或在其他数据库上使用递归查询来完成,但 Redshift 不支持两者。

如何在 Redshift 上实现这一点

【问题讨论】:

标签: sql amazon-redshift


【解决方案1】:
select
    distinct COL_1,
    listagg(distinct COL_2,
    ',') within group (
    order by COL_2 desc) as my_list
from
    table
group by 1

但是我有一个以下问题,关于我们如何在不使用子字符串的情况下检索此列表的第二个元素(例如,如果它是一个数组,我们可以只做数组 [1])

【讨论】:

    【解决方案2】:

    这是另一个类似问题的解决方案 -

    SELECT col1,
       LISTAGG(col2,', ')
    WITHIN GROUP (ORDER BY col2)
    OVER (PARTITION BY col1) AS EMPLOYEE
    FROM YOUR_TABLE
    ORDER BY col1
    

    This question.

    Redshift 引入了 LISTAGG 窗口函数,现在可以做到这一点。这是您问题的快速解决方案-可能有用也可能没有用,但将其放在这里以便人们知道!

    Here is the documentation about the function. || This is the announcement.

    【讨论】:

      【解决方案3】:

      他们刚刚将 LISTAGG() 添加到 Redshift (2015-07-31)。 http://docs.aws.amazon.com/redshift/latest/dg/r_LISTAGG.html

      【讨论】:

      • 请注意,这不适用于系统/目录表。
      【解决方案4】:

      尝试在子查询中获取每个组行的row_number,然后在子查询之上执行

      max(case when row_num_value =1 then col_value end)||','
      max(case when row_num_value =2 then col_value end)||','
      max(case when row_num_value =3 then col_value end)||.....
      

      这当然是一个限制版本,上限由你选择。

      【讨论】:

      • 我考虑过这种方法,是的,只要 row_num_value 的数量很少,它就可以工作。我正在寻找不对其进行硬编码并针对大量值进行缩放的方法。谢谢
      • 目前 Redshift 中没有这样的 UDF,我们正在等待 Redshift 打开 UDF 功能来执行这些操作。
      • 考虑到 Redshift 中的 LISTAGG() 不适用于系统/目录表,我不得不使用这种解决方法(假设
      【解决方案5】:
      SELECT Col1, ARRAY_TO_STRING(ARRAY_AGG(Col2 ORDER BY Col2 ASC), ' ')
      FROM MyTable
      GROUP BY Col1;
      

      我不知道您使用的是哪个版本的 PostgreSQL。在 8.4 版本之前,您必须先定义函数 array_agg,然后才能使用它:

      CREATE AGGREGATE array_agg (anyelement)
      (
          sfunc = array_append,
          stype = anyarray,
          initcond = '{}'
      );
      

      【讨论】:

      • 我正在使用 Amazon Redshift。它适用于 Postgres 驱动程序 8.1,但还不允许创建函数。
      【解决方案6】:

      试试这个:

      SELECT COL1,STRING_AGG(COL2,' ') AS COL2 FROM TABLE_NAME GROUP BY COL1
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-23
      • 2016-08-15
      • 2016-06-27
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多