使用生成器函数生成日期
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'
newcol
在 select
子句中定义,因此在 where
子句中不可用。这通常是通过计算内部范围内的值,然后使用它在外部范围内进行过滤来解决的:子查询、横向连接和常见的 table 表达式是最常见的方法。所以:
select *
from (
select t.*, 'abc' as newcol
from mytable t
) t
where newcol = 'abc'
令我惊讶的是您的第一个查询甚至可以编译;这可能是一些 Snowflake-specific 的事情。但是第二个查询确实是做你想做的正确方法:
这是我用来生成每周最后一个日期的查询。但是过滤器似乎没有生效。我得到的开始日期是“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'
newcol
在 select
子句中定义,因此在 where
子句中不可用。这通常是通过计算内部范围内的值,然后使用它在外部范围内进行过滤来解决的:子查询、横向连接和常见的 table 表达式是最常见的方法。所以:
select *
from (
select t.*, 'abc' as newcol
from mytable t
) t
where newcol = 'abc'
令我惊讶的是您的第一个查询甚至可以编译;这可能是一些 Snowflake-specific 的事情。但是第二个查询确实是做你想做的正确方法: