【问题标题】:Using Generator function to generate date使用 Generator 函数生成日期
【发布时间】:2021-02-09 00:39:33
【问题描述】:

这是我用来生成每周最后日期的查询。但是过滤器似乎没有生效。我得到的开始日期是“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 subquery where-clause snowflake-cloud-data-platform


    【解决方案1】:

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

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

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

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

    我很惊讶您的第一个查询竟然可以编译;它可能是一些雪花特有的东西。但是第二个查询确实是做你想做的事情的正确方法:

    【讨论】:

    • 确实我期待它无法编译。
    猜你喜欢
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2015-04-07
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多