使用生成器函数生成日期

Using Generator function to generate date

这是我用来生成每周最后一个日期的查询。但是过滤器似乎没有生效。我得到的开始日期是“2016-01-03”。

SELECT TO_DATE(last_day(DATEADD(DAY, SEQ4()*7, '2016-01-01 00:00:00'), 'week')) AS WEEK_LAST_DATE
FROM TABLE(GENERATOR(ROWCOUNT=>1000)) 
WHERE WEEK_LAST_DATE > '2016-09-07';

下面的工作虽然:

SELECT * from (
  SELECT TO_DATE(last_day(DATEADD(DAY, SEQ4()*7, '2016-01-01 00:00:00'), 'week')) AS WEEK_LAST_DATE
  FROM TABLE(GENERATOR(ROWCOUNT=>1000))
) as A
WHERE A.WEEK_LAST_DATE > '2016-09-07';

为什么第一个查询不起作用?

一般来说,在 SQL 中,您不能在同一范围内引用 select 子句中定义的表达式 - 除了 order by 子句。通常,这会引发语法错误:

select t.*, 'abc' as newcol
from mytable t
where newcol = 'abc'

newcolselect 子句中定义,因此在 where 子句中不可用。这通常是通过计算内部范围内的值,然后使用它在外部范围内进行过滤来解决的:子查询、横向连接和常见的 table 表达式是最常见的方法。所以:

select *
from (
    select t.*, 'abc' as newcol
    from mytable t
) t
where newcol = 'abc'

令我惊讶的是您的第一个查询甚至可以编译;这可能是一些 Snowflake-specific 的事情。但是第二个查询确实是做你想做的正确方法: