在红移中具有 DISTINCT 的 listagg

Posted

技术标签:

【中文标题】在红移中具有 DISTINCT 的 listagg【英文标题】:listagg with DISTINCT in redshift 【发布时间】:2017-07-07 11:28:40 【问题描述】:

我正在努力寻找一种在红移中执行 DISTINCT in listagg 的好方法。

我只想列出产品组合,但每一行都应返回不同产品的列表。

示例

期望的输出:

bulb, light
bulb, light, fan

代替:

bulb, bulb, light
bulb, bulb, light, fan

下面是我的 SQL:

select
    tit.listagg  
from (
    SELECT
        username,
        listagg(node_name, ',')
        WITHIN GROUP (ORDER BY node_name asc)
    FROM table
    Where node_type not like '%bla bla%'
    GROUP BY username
) as tit
group by listagg;

【问题讨论】:

您现在可以在listagg 中使用DISTINCT 作为可选子句。更多细节在这里:docs.aws.amazon.com/redshift/latest/dg/r_LISTAGG.html 【参考方案1】:

您可以枚举行,然后选择第一行:

select username,
       listagg(case when seqnum = 1 then node_name end, ',') within group (order by node_name asc) 
from (select t.*,
             row_number() over (partition by username, node_name order by node_name) as seqnum
      from table t
      where node_type not like '%bla bla%' 
     ) t
group by username;

这使用了listagg() 忽略NULL 值的功能。

【讨论】:

真正卓越的反应和迅速。得到它的工作。 :)【参考方案2】:

Redshift 现在支持 LISTAGG DISTINCT,因此不需要子查询:https://aws.amazon.com/about-aws/whats-new/2017/10/amazon-redshift-announces-support-for-listagg-distinct/

【讨论】:

以上是关于在红移中具有 DISTINCT 的 listagg的主要内容,如果未能解决你的问题,请参考以下文章

在红移中评估的顺序是啥

在红移中作为选择插入

在红移中插入

数据值“0”在红移中有无效格式错误

如何在红移中获取过去 X 周的数据?

在红移中计算一年中的周数作为excel中的weeknum()