【问题标题】:Teradata: Results with duplicate values converted into comma delimited stringsTeradata:将重复值转换为逗号分隔字符串的结果
【发布时间】:2020-12-20 07:09:17
【问题描述】:

我有一个典型的表格,其中每一行代表一个客户 - 产品持有。如果一个客户有多个产品,那么会有多行具有相同的客户 ID。我正在尝试将其汇总,以便每个客户都由一行表示,所有产品代码在一个逗号分隔的字符串中连接在一起。下图说明了这一点

在谷歌搜索后,我设法使用 XMLAGG 函数让它工作 - 但这仅适用于一小部分数据,当扩大规模时,Teradata 抱怨“假脱机空间”用完 - 所以我认为这不是很高效。

有谁知道如何有效地实现这一目标?

【问题讨论】:

  • 您的 Teradata 版本是什么?是否有已知的每位客户的最大产品数量?

标签: sql teradata string-aggregation


【解决方案1】:

较新版本的 Teradata 支持 NPath,可用于此目的。你必须习惯语法,它是一个 Table Operator :-)

例如这将返回系统中每个表的列列表:

SELECT * 
FROM 
   NPath(ON(SELECT databasename, tablename, columnname, columnid 
            FROM dbc.columnsV
           ) AS dt                            -- input data
         PARTITION BY databasename, tablename -- group by columns
         ORDER BY columnid                    -- order within list
         USING
           MODE (NonOverlapping)              -- required syntax 
           Symbols (True AS F)                -- every row
           Pattern ('F*')                     -- is returned
           RESULT(First (databasename OF F) AS DatabaseName, -- group by column
                  First (tablename OF F) AS TableName,       -- group by column
                  Count (* OF F) AS Cnt,
                  Accumulate(Translate(columnname USING unicode_to_latin) OF ANY (F)) AS ListAgg
                 )
        );

应该比 XMLAgg 更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多