2016-04-10 175 views
0

需要你的帮助来解决我与转换Teradata表列逗号分隔值

挣扎特定的问题,我有一个Teradata表看起来像下面。

Queryid Databasename Tablename 
101  DB1    TB1 
101  DB2    TB2 
101  DB1    TB3 
102  DB3    TB3 
102  DB4    TB4 
.  .    . 
.  .    . 
.  .    . 

我需要以下格式的输出。

Queryid Newcol 
101  DB1.TB1,DB2.TB2,DB1.TB3 
102  DB3.TB3,DB4.TB4 
.   ....... 
.   ....... 

我正在使用TD13.10,并且没有XML服务,并且TDStats功能也不可用。

任何帮助将是巨大的..

感谢

+0

看起来像一个分析QryLogObjectsV的查询,你要处理的数据量是多少?你结果怎么样? – dnoeth

+0

嗨Dieter,我正在尝试处理1个月的数据,我正在尝试生成一个报告,其中每个queryid都有一行,在该行中,我有我的totalampcputime,响应时间以及该queryid访问的对象。如果我对每个queryid访问的所有对象都有多行,那么ampcputime和responsetime将乘以总行数,因此最终结果将不正确。 – SRG

回答

0

可以递归使用。尽管您将不得不使用另一个表来存储和使用该表递归使用该表来按rownumber连接值。

CREATE VOLATILE TABLE temp_tbl AS (
SELECT 
    queryid      
    ,databasename ||'.'||tablename               
    ,ROW_NUMBER() OVER (PARTITION BY queryid ORDER BY queryid) AS rnk 
FROM temp 
) WITH DATA PRIMARY INDEX(parent_id) ON COMMIT PRESERVE ROWS 

WITH RECURSIVE test1(query,databasename,tablename,LVL) 


AS 
    (
    SELECT queryid,databasename,tablename, 1 
    FROM <tablename> 
    WHERE rnk = 1 
    UNION ALL 
    SELECT queryid, TRIM(databasename) || ', ' || TRIM(tablename),LVL+1 
    FROM temp_tbl INNER JOIN test1 
    ON queryid = query 
    AND temp_tbl.rn = test1.lvl+1 
    ) 
    SELECT query,databasename,tablename,LVL 
    FROM test1 
QUALIFY RANK() OVER(PARTITION BY query ORDER BY LVL DESC) = 1; 
+0

感谢您的答复Aritra ..只是一些问题..以下符号表示什么... 1)temp(我假设这是用于存储正在处理的数据的表,2)不知道什么PRIMARY INDEX(parent_id)的意思是,3)FROM ,应该在这里使用什么表格4)INNER JOIN rec_test,我找不到这张表 – SRG

+0

@SRG .. yest temp只是我给存储数据表的一个随机名。主索引是我在易失性表temp_tbl上定义的索引。对于主索引中的概念,您可以在wiki/google中进行搜索。内部连接部分将test1,我已编辑,这是逻辑的递归方面,这有助于获得您想要的结果。如果这个答案有助于实现你的目标,请接受它。 –

+0

非常感谢Aritra,会给它一个尝试,只是最后一个问题..你在递归查询中提到了SELECT queryid,databasename,tablename, 从代表什么? – SRG