Teradata宏,带有volatile表和CTE,用于将数据插入表中
我需要创建一个teradata宏,首先将信息提取到易失性表中,然后执行CTE从该易失性表中提取数据并插入到teradata表中,尝试了不同的方法都失败了,感谢帮助Teradata宏,带有volatile表和CTE,用于将数据插入表中,teradata,Teradata,我需要创建一个teradata宏,首先将信息提取到易失性表中,然后执行CTE从该易失性表中提取数据并插入到teradata表中,尝试了不同的方法都失败了,感谢帮助 CREATE MACRO database.macro_insertion_tablename AS ( CREATE VOLATILE TABLE vt AS ( SELECT id, bu, CONCAT(TO_CHAR(comment_date, 'yyyy-mm-dd HH24:
CREATE MACRO database.macro_insertion_tablename AS (
CREATE VOLATILE TABLE vt AS
(
SELECT
id, bu,
CONCAT(TO_CHAR(comment_date, 'yyyy-mm-dd HH24:MI:SS'), ' ', action) AS full_action,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS row_num,
COUNT(*) OVER (PARTITION BY id) as cnt
FROM database.table1
) WITH DATA UNIQUE PRIMARY INDEX(id, row_num) ON COMMIT PRESERVE ROWS;
WITH RECURSIVE cte (id, bu, act, rn) AS
(
SELECT
id, bu
,CAST(full_action AS VARCHAR(5000)) AS full_action
,row_num
FROM vt
WHERE row_num = cnt
UNION ALL
SELECT
vt.id, vt.bu
,cte.act || ' / ' || vt.full_action
,vt.row_num
FROM vt
JOIN cte On vt.id = cte.id AND vt.row_num = cte.rn - 1
)
INSERT INTO database.table (id, bu, full_action)
SELECT id, bu, act
FROM cte
WHERE rn = 1;
DROP TABLE vt;
);
为了跟进我的评论,您应该能够在同一语句中定义多个CTE。让递归CTE工作起来可能很棘手,但听起来这是可能的。也许是这样的:
CREATE MACRO database.macro_insertion_tablename AS (
WITH vt (id, bu, full_action, row_num, cnt) AS
(
SELECT
id, bu,
CONCAT(TO_CHAR(comment_date, 'yyyy-mm-dd HH24:MI:SS'), ' ', action) AS full_action,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS row_num,
COUNT(*) OVER (PARTITION BY id) as cnt
FROM database.table1
),
RECURSIVE cte (id, bu, act, rn) AS
(
SELECT
id, bu
,CAST(full_action AS VARCHAR(5000)) AS full_action
,row_num
FROM vt
WHERE row_num = cnt
UNION ALL
SELECT
vt.id, vt.bu
,cte.act || ' / ' || vt.full_action
,vt.row_num
FROM vt
JOIN cte On vt.id = cte.id AND vt.row_num = cte.rn - 1
)
INSERT INTO database.table (id, bu, full_action)
SELECT id, bu, act
FROM cte
WHERE rn = 1;
);
我没有一个Teradata系统可以测试,所以它不能100%按原样工作,但请尝试一下。您可能需要将RECURSIVE更改为WITH RECURSIVE,还需要更改CTE查询的顺序,即将RECURSIVE查询放在第一位。请看以下两个链接:
DDL必须是Teradata宏中的唯一语句
作为解决方法,您可以切换到一个全局临时表,该表只定义一次,然后您只需在其中插入/选择,而不是创建VOLATILE表
但在您的情况下,不需要临时表和低效的递归处理来获得组concat:
SELECT id, max(bu) -- maybe min(bu)?
XmlAgg(Concat(To_Char(comment_date, 'yyyy-mm-dd HH24:MI:SS'), ' ', action)
ORDER BY comment_date) (VARCHAR(5000)) AS full_action
FROM database.table1
GROUP BY 1
将给你一个类似的结果 你说失败是什么意思?这是一个错误还是你没有看到你所期待的?您期望得到什么结果以及当前得到什么?请记住,您定义的易失性表仅对创建它的会话可用。除了指定结果集id的分布之外,row_num是否有特殊原因需要使用易失性表?您不能在INSERT中将volatile表的结果集作为辅助CTE合并到database.table中吗。。。语句?谢谢,但不起作用,看起来宏无法插入。我将尝试SP,看看它是否有效。当您在宏外部自行运行查询时会发生什么情况?请尝试分解各个SELECT查询,看看它们是否都返回了您期望的行。尝试不工作,只选择即可,但插入到。。。选择它不起作用。谢谢。你不工作是什么意思?是否有错误或表中没有插入行?请提供尽可能多的详细信息。我计算出,对于递归表,插入teradata的正确语法是插入到带有vt as sel的表中,递归rt作为sel。。。。选择来自rt,谢谢@ravioli