当我用雪花写下面的代码时,我得到了错误。
set start_date = '2020-08-01'::TIMESTAMP_NTZ(9);
set end_date = '2020-11-30'::TIMESTAMP_NTZ(9);
WITH DateTable AS (
SELECT $start_date AS MyDate
UNION ALL
SELECT DATEADD(DAY, 1, MyDate) FROM DateTable WHERE MyDate < $end_date
)
SELECT * FROM DateTable; 错误信息如下..。
Recursion exceeded max iteration count (100)似乎没有办法增加我自己的最大迭代次数。
我怎样才能增加介入次数的限制?
发布于 2020-11-15 16:13:02
使用生成器的非递归版本
SET (start_date,end_date)=('2020-08-01'::TIMESTAMP_NTZ(9),'2020-11-30'::TIMESTAMP_NTZ(9));
SET c = (SELECT DATEDIFF(DAY, $start_date, $end_date));
SELECT DATEADD(DAY, c.n, $start_date) AS calc_date
FROM(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 FROM TABLE(generator(rowcount=>$c))) c(n);解释:
变量c保存开始日期/结束日期之间的天数,是生成器的输入。生成器返回指定的行数。ROW_NUMBER() OVER() - 1窗口函数返回从0开始的连续数字,这些数字被添加到start_date中。
发布于 2020-11-15 14:45:56
看起来,最大迭代并不容易修改。The 文件上说
理论上,不正确地构造递归CTE会导致无限循环。实际上,雪花通过限制递归子句在单个查询中执行的迭代次数来防止这一点。
The MAX_RECURSIONS参数限制迭代次数。 若要更改您的帐户的MAX_RECURSIONS,请联系雪花支持。
对于特定的用例,可以通过更改查询的逻辑来绕过限制。您实际上并不需要递归来实现您的目标;相反,您可以使用窗口函数和任何作为足够多行的表,比如bigtable(col)。
select dateadd(day, x.rn - 1, $start_date) as mydate
from (select row_number() over (order by col) rn from bigtable) x
where dateadd(day, x.rn - 1, $start_date) <= $end_datehttps://stackoverflow.com/questions/64845646
复制相似问题