如何在Redshift上编写listagg?

时间:2014-09-09 12:29:10

标签: sql amazon-redshift

如下所示的样本数据

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上实现此功能

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

尝试在子查询中获取每个组行的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)||.....

这是一个有限的版本,其上限可以根据您的选择而定。

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

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 = '{}'
);

答案 4 :(得分:0)

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

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.

答案 5 :(得分:-1)

select
    distinct COL_1,
    listagg(distinct COL_2,
    ',') within group (
    order by COL_2 desc) as my_list
from
    table
group by 1

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