Как фильтровать по столбцу, сгенерированному в том же запросе? - PullRequest
1 голос
/ 11 февраля 2020

Ниже приведен очень простой запрос, в котором my_data состоит только из 1 строки и служит только для того, чтобы помочь мне лучше объяснить мою проблему.

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, и я предполагаю, что он создается по одному и тому же запросу.

Мой вопрос:

  1. Можно ли выполнить фильтрацию по новому сгенерированному столбцу, который был сгенерирован в том же запросе и не существует в моей таблице (my_data)?
  2. Это правильный путь или это плохая практика?

Обходной путь - просто сначала создать my_data без этого фильтра, но с дополнительным столбцом my_date, а затем отфильтровать его, пройдя через него снова.

Спасибо

Ответы [ 3 ]

2 голосов
/ 11 февраля 2020

Я хочу начать отвечать на ваш вопрос в том виде, в котором вы его представили.

  1. Нет, вы не можете фильтровать по новому сгенерированному псевдониму столбца, который вы просто создаете в операторе select, и я объясню, почему позже.

  2. С другой стороны, вы правильно используете CLE (деталь, которая начинается с WITH) для фильтрации данных в последующем SELECT. Проблема в том, что вы ссылаетесь не на ту вещь.

В первой части вы только что создали новую таблицу с именем "my_data" , и эта таблица содержит два столбца: my_timestamp и my_customer . Впоследствии вы можете запросить эту таблицу и отфильтровать по отметке времени, единственное, что вы не можете использовать псевдоним, который вы создали в операторе SELECT в предложении WHERE. Это связано с тем, что существует определенный порядок, в котором выполняются операторы SQL.

В этом случае вы используете псевдоним "my_date" в предложении where но WHERE обрабатывается перед предложением SELECT , поэтому предложение WHERE не знает, что такое "my_date" , и для этого причина, по которой вы получаете эту ошибку, касающуюся «my_date».

Я не уверен в синтаксическом анализе в BigQuery, никогда не используйте его раньше, но при условии, что ваш анализ с датами правильный. Единственное изменение, которое потребуется вашему запросу, это изменить "my-date" в предложении where на DATE (my_timestamp)

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"

Найдите ниже SQL Порядок работы, о котором я упоминал ранее. Всегда важно учитывать это при разработке запросов.

  1. ОТ
  2. ГДЕ
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ЗАКАЗАТЬ ПО

Надеюсь, эта помощь.

1 голос
/ 11 февраля 2020

Ниже "трюк" для BigQuery Standard 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"
0 голосов
/ 11 февраля 2020

почему бы не дублировать функцию, которую вы уже используете?

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...