Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何按同一查询中生成的列进行筛选?_Sql_Google Bigquery - Fatal编程技术网

Sql 如何按同一查询中生成的列进行筛选?

Sql 如何按同一查询中生成的列进行筛选?,sql,google-bigquery,Sql,Google Bigquery,下面是一个非常简单的查询,其中my_data只包含一行,它只是为了帮助我更好地解释我的问题 WITH my_data AS( SELECT TIMESTAMP("2020-02-11 13:15:00 UTC") AS my_timestamp ,50 AS my_customers) SELECT DATE(my_timestamp) AS my_date ,my_customers FROM my_data WHER

下面是一个非常简单的查询,其中
my_data
只包含一行,它只是为了帮助我更好地解释我的问题

WITH

    my_data AS(
    SELECT
        TIMESTAMP("2020-02-11 13:15:00 UTC") AS my_timestamp
        ,50 AS my_customers)

SELECT
    DATE(my_timestamp) AS my_date
    ,my_customers
FROM
    my_data
WHERE
    my_date = "2020-02-11"
这不会在Google Big Query的标准SQL中运行,尽管我记得在过去运行过类似的东西。它不会运行的原因是它不知道my_date是什么,我猜是因为它是在同一个查询中创建的

我的问题是:

  • 我可以按新生成的列进行筛选吗?该列是在同一查询中生成的,在我的表中不存在(
    my_data
  • 这是正确的方法还是不好的做法
  • 一种解决方法是先创建
    my_数据
    ,不使用该过滤器,但使用额外的列
    my_日期
    ,然后通过再次查看来过滤它


    谢谢

    为什么不复制您已经在使用的功能

    WITH
      my_data AS(
      SELECT
        TIMESTAMP("2020-02-11 13:15:00 UTC") AS my_timestamp,
        50 AS my_customers)
    SELECT
      DATE(my_timestamp) AS my_date,
      my_customers
    FROM
      my_data
    WHERE
      DATE(my_timestamp) = "2020-02-11"
    
    下面的“技巧”是针对BigQuery标准SQL的

    #standardSQL
    WITH
    
        my_data AS(
        SELECT
            TIMESTAMP("2020-02-11 13:15:00 UTC") AS my_timestamp
            ,50 AS my_customers)
    
    SELECT
        my_date
        ,my_customers
    FROM
        my_data,
    UNNEST([DATE(my_timestamp)]) AS my_date    
    WHERE
        my_date = "2020-02-11"
    

    我想开始回答你提出的问题

  • 不可以,您不能按刚才在select语句中创建的新生成的列别名进行筛选,稍后我将解释原因

  • 另一方面,使用CLE(以开头的部分)在后续选择中过滤数据是正确的。问题是你引用了错误的东西

  • 在第一部分中,您刚刚创建了一个名为“my_data”的新表,该表包含两列:my_timestampmy_customer。随后可以查询该表并按时间戳进行筛选,唯一的问题是不能使用在WHERE子句的SELECT语句中创建的别名。这是因为SQL操作符的运行有一定的顺序

    在这种情况下,您在where子句中使用别名“my_date”,但是whereSELECT子句之前被处理,因此where子句不知道my_date是什么,因此您收到关于“my_date”的错误

    我不确定BigQuery中的解析,以前从未使用过它,但假设您的日期解析是正确的。查询所需的唯一更改是通过日期(my_时间戳)更改where子句中的“my date”

    在下面查找我之前提到的SQL操作顺序。在设计查询时考虑这一点总是至关重要的。

  • 在哪里
  • 分组
  • 拥有
  • 挑选
  • 订购人

  • 希望获得此帮助。

    否,您无法在
    中筛选
    中定义的别名,而
    是在
    选择中定义的。使用CTE、子查询或重复表达式。将
    WHERE
    更改为
    HAVING
    @mattyx17我刚刚尝试了
    HAVING
    ,但它要求所有字段按
    分组,基本上消除了所有重复行。除非我做错了什么。这就像是一个危险的解决办法@戈登·林诺夫,如果就这些,你能写下来作为答案吗?我明白了。很好的解释。我不熟悉SQL的操作顺序。这是有道理的,我也不是。这件事让我疯狂了很长一段时间,直到我意识到并研究了操作顺序。我相信在一开始的时候,很直观地认为WHERE应该能够根据我们在SELECT上使用的任何东西进行过滤。希望我们现在知道SQL不是这样工作的。很高兴这能帮助我的朋友。嗨,刚刚找到chartio的这个很棒的链接,他们在这里解释了sql查询的顺序。我相信这会有所帮助。
    
    WITH
      my_data AS(
      SELECT
        TIMESTAMP("2020-02-11 13:15:00 UTC") AS my_timestamp,
        50 AS my_customers)
    SELECT
      DATE(my_timestamp) AS my_date,
      my_customers
    FROM
      my_data
    WHERE
      DATE(my_timestamp) = "2020-02-11"