generate_series() 相当于雪花

Tar*_*rik 6 sql generate-series snowflake-cloud-data-platform

我试图找到与 generate_series() (PostgreSQL 语法)等效的雪花。

SELECT generate_series(timestamp '2017-11-01', CURRENT_DATE, '1 day')
Run Code Online (Sandbox Code Playgroud)

小智 11

只是想扩展Marcin Zukowski的评论,说在JOIN.

我们最终还是这样做了!

select
  dateadd(
    day,
    '-' || row_number() over (order by null),
    dateadd(day, '+1', current_date())
  ) as date
from table (generator(rowcount => 90))
Run Code Online (Sandbox Code Playgroud)


小智 7

我遇到了类似的问题,并找到了一种方法,除了这里已经很好的答案之外,它还通过使用会话变量来避免生成器需要常量值的问题。这最接近我心目中OP的要求。

-- set parameter to be used as generator "constant" including the start day
set num_days =  (Select datediff(day, TO_DATE('2017-11-01','YYYY-MM-DD'), current_date()+1));
-- use parameter in bcrowell's answer now
select
  dateadd(
    day,
    '-' || row_number() over (order by null),
    dateadd(day, '+1', current_date())
  ) as date
from table (generator(rowcount => ($num_days)));
-- clean up previously set variable
unset num_days;
Run Code Online (Sandbox Code Playgroud)


ilj*_*jau 7

WITH RECURSIVE rec_cte AS (
    -- start date
    SELECT '2017-11-01'::DATE as dt
    UNION ALL
    SELECT DATEADD('day',1,dt) as dt
    FROM rec_cte
    -- end date (inclusive)
    WHERE dt < current_date()
)
SELECT * FROM rec_cte
Run Code Online (Sandbox Code Playgroud)


wat*_*bay -2

这就是我在 Snowflake 中生成一系列日期的方法。我将行数设置为 1095 以获取 3 年的日期,您当然可以将其更改为适合您的用例的任何值

select 
    dateadd(day, '-' || seq4(), current_date()) as dte 
from 
    table 
       (generator(rowcount => 1095))
Run Code Online (Sandbox Code Playgroud)

原来在这里找到的

编辑:这个解决方案不正确。seq4不保证序列没有间隙。请遵循其他答案,而不是这个答案。感谢@Marcin Zukowski 指出了这一点。

  • 警告:这应该适用于短序列,但请记住 SEQ 不能保证生成密集序列 - 如果生成数百万条记录,则可能会出现漏洞。 (4认同)
  • 为了进一步@MarcinZukowski 的评论,这些差距不是理论上的,它们取决于仓库的大小。永远不应期望 seq4 会创建密集序列。这个问题的其他答案避免了这个问题。 (3认同)