【问题标题】:Snowflake Creating a List of Dates雪花创建日期列表
【发布时间】:2021-03-02 23:11:16
【问题描述】:

此代码在 SSMS 中完美运行,但在 Snowflake 中却没有那么多。关于如何修复它的任何建议?

 set (start_date) = ('2017-07-01');
 set (end_date) = ('2022-06-30');

  with get_all_dates as (




      select 
        $start_date as DateValue
        , 1 as level
      union all
      select    
        DATEADD(DAY,1,DateValue)
        , level + 1
      from 
        get_all_dates
      where 
        Datevalue < $end_date
  
  )
  
  select * from get_all_dates;

这会产生以下错误消息:

SQL 编译错误:锚点和递归项之间的类型不匹配 递归 CTE 'GET_ALL_DATES' 中的列 'DATEVALUE'

预期输出:

2017-07-01
2017-07-02
...
2022-06-29
2022-06-30

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    Gordon 的回答很有用,但请注意—— seq4() 不能保证产生序列号。这意味着您可能会得到一系列不同的日期,而不是想要的结果。

    您可以这样做:

    select '2020-01-01'::date+x 
    from (
      select row_number() over(order by 0) x 
      from table(generator(rowcount => 1824))
    )
    

    短版:

    select '2020-01-01'::date + row_number() over(order by 0) x 
    from table(generator(rowcount => 1824))
    

    使用任意的 start_date 和 end_date:

    select -1 + row_number() over(order by 0) i, start_date + i generated_date 
    from (select '2020-01-01'::date start_date, '2020-01-15'::date end_date)
    join table(generator(rowcount => 10000 )) x
    qualify i < 1 + end_date - start_date
    

    【讨论】:

    • 我是 Snowflake 的新手,“SELECT”在此列表中的排名:docs.snowflake.com/en/sql-reference/constructs/qualify.html我正在尝试消化您的查询。
    • SELECT 在这种情况下是混合的。我介绍了qualify 因为generator(rowcount =&gt; 10000 ) 会产生太多的行,所以我删除了所有不在日期范围内的行。子查询也可以代替使用qualify,但这样更紧凑。
    【解决方案2】:

    您可以生成一堆数字并根据这些数字生成日期:

    select dateadd(day, row_number() over (order by null), '2017-07-01')
    from table(generator(rowcount => 1824)) g
    

    【讨论】:

    • 这里小心! seq4() 可以产生非连续数字。 “这个函数使用序列来产生一组独特的递增整数,但不一定产生一个无间隙的序列。” docs.snowflake.com/en/sql-reference/functions/seq1.html
    • @FelipeHoffa 。 . .如果我使用row_number(),那么合适的order by 是什么? order by seq4()? order by NULL?
    猜你喜欢
    • 2021-04-23
    • 2022-01-23
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多