Создайте рекурсивное представление, в котором есть «с рекурсивным» утверждением в Teradata

Я хотел бы создать рекурсивный вид в Teradata (т. CREATE RECURSIVE VIEW ) из следующего воспроизводимого примера:

 CREATE VOLATILE TABLE vt1 ( foo VARCHAR(10) , counter INTEGER , bar INTEGER ) ON COMMIT PRESERVE ROWS; INSERT INTO vt1 VALUES ('a', 1, '1'); INSERT INTO vt1 VALUES ('a', 2, '2'); INSERT INTO vt1 VALUES ('a', 3, '2'); INSERT INTO vt1 VALUES ('a', 4, '4'); INSERT INTO vt1 VALUES ('a', 5, '1'); INSERT INTO vt1 VALUES ('b', 1, '3'); INSERT INTO vt1 VALUES ('b', 2, '1'); INSERT INTO vt1 VALUES ('b', 3, '1'); INSERT INTO vt1 VALUES ('b', 4, '2'); WITH RECURSIVE cte (foo, counter, bar, rsum) AS ( SELECT foo , counter , bar , bar AS rsum FROM vt1 QUALIFY ROW_NUMBER() OVER (PARTITION BY foo ORDER BY counter) = 1 UNION ALL SELECT t.foo , t.counter , t.bar , CASE WHEN cte.rsum < 3 THEN t.bar + cte.rsum ELSE t.bar END FROM vt1 t JOIN cte ON t.foo = cte.foo AND t.counter = cte.counter + 1 ) SELECT cte.* , CASE WHEN rsum < 5 THEN 0 ELSE 1 END AS tester FROM cte ORDER BY foo , counter ; 

Это создает этот результат:

 ╔═════╦═════════╦═════╦══════╦════════╗ ║ foo ║ counter ║ bar ║ rsum ║ tester ║ ╠═════╬═════════╬═════╬══════╬════════╣ ║ a ║ 1 ║ 1 ║ 1 ║ 0 ║ ║ a ║ 2 ║ 2 ║ 3 ║ 0 ║ ║ a ║ 3 ║ 2 ║ 5 ║ 1 ║ ║ a ║ 4 ║ 4 ║ 4 ║ 0 ║ ║ a ║ 5 ║ 1 ║ 5 ║ 1 ║ ║ b ║ 1 ║ 3 ║ 3 ║ 0 ║ ║ b ║ 2 ║ 1 ║ 4 ║ 0 ║ ║ b ║ 3 ║ 1 ║ 5 ║ 1 ║ ║ b ║ 4 ║ 2 ║ 2 ║ 0 ║ ╚═════╩═════════╩═════╩══════╩════════╝ 

Который я в конечном итоге хотел бы «сохранить» как точку зрения. Я попробовал CREATE RECURSIVE VIEW и несколько вариантов, но я думаю, что не понимаю, как WITH RECURSIVE cte оператор WITH RECURSIVE cte .

По поводу связанного с этим вопроса, чтобы понять, что происходит, см. Этот вопрос

Ладно, это было на самом деле сложнее, чем я думал:

 create recursive view db.test_view ( foo, counter,bar,rsum) as (SELECT foo, counter, bar, bar AS rsum FROM vt1 QUALIFY ROW_NUMBER() OVER (PARTITION BY foo ORDER BY counter) = 1 UNION ALL SELECT t.foo, t.counter, t.bar, CASE WHEN cte.rsum < 5 THEN t.bar + cte.rsum ELSE t.bar END FROM vt1 t JOIN test_view cte ON t.foo = cte.foo AND t.counter = cte.counter + 1 ) 

Не квалифицируйте рекурсивное соединение для представления. IE, JOIN test_view , а не JOIN db.test_view .

летучие таблицы хранятся в квоте пространства спула пользователя и должны быть квалифицированы с вашим именем пользователя.
Ps Почему вы используете волатильные таблицы в первую очередь?