问题描述
我有一个典型的表,其中每一行代表一个客户-产品持有人。如果客户有多个产品,则将有多个具有相同客户ID的行。我试图将其汇总起来,以使每个客户都由一行代表,所有产品代码都用一个逗号分隔的字符串连接在一起。下图说明了这一点
在搜索完此内容后,我设法使用XMLAGG函数使其工作-但这仅适用于一小部分数据样本,当按比例放大时,Teradata抱怨用完“假脱机空间”-所以我认为它不是很
有人知道如何有效地实现这一目标吗?
解决方法
Teradata的较新版本支持NPath
,可用于此目的。您必须习惯语法,这是一个 Table运算符:-)
例如这将返回系统中每个表的列列表:
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好。