如下所示的样本数据
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上实现此功能
答案 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
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])