Невозможно использовать функцию IN для фильтра разделов таблицы представления в BigQuery

Итак, у меня есть таблица представления с именем table_1 и поле раздела с именем business_date. Thie table_1 создается с использованием необработанной таблицы с именем data_mart.customer_raw.

Из этой таблицы вытекает множество бизнес-потребностей, одна из которых — проверка транзакций клиентов в каждом конце месяца.

Вот как я обычно делаю свой запрос:

SELECT
  customer_id
  ,total_transaction
FROM
  table_1
WHERE
  business_date IN ('2024-01-31', '2024-02-29', '2024-03-31')

Это работает хорошо, но проблема в том, что мне приходится вручную создавать фильтр business_date, что станет проблемой, если мне понадобится более 10 дат.

Вот обходной путь, который я пробовал для этой проблемы:

WITH dim_date AS (
SELECT
  DISTINCT business_date
FROM
  table_date
WHERE
  eom_flag IS TRUE
)

SELECT
  customer_id
  ,total_transaction
FROM
  table_1
WHERE
  business_date IN (SELECT business_date FROM dim_date)

Примечание: table_date — таблица со списком дат.

Обходной путь выше приводит к этой ошибке:

Невозможно выполнить запрос к таблице «data_mart.customer_raw» без фильтра по столбцам «business_date», который можно использовать для исключения разделов.

Есть ли способ решить эту ошибку?

Привет @Ирен Рамадан! Можете ли вы проверить, полезна ли следующая документация?

Nithish Kumar Ramisetty 17.07.2024 12:56

@NithishKumarRamisetty Это отличная документация, но, к сожалению, она не отвечает на мой вопрос выше.

Iren Ramadhan 17.07.2024 16:53

Комментарий г-на Нитиша идеален. Он просит вас просмотреть документацию, которая находится на месте. Ошибка, которую вы получаете, связана с тем, что вы запрашиваете таблицу, для которой ОБЯЗАТЕЛЬНО требуется предоставить фильтр разделов, а вы его не предоставили. Что такое «customer_raw»? Я предполагаю, что это исходная таблица для просмотра таблицы?

Kolban 18.07.2024 06:14

@Kolban Да, table_1 — это таблица представления, которая ссылается на таблицу customer_raw. Мой вопрос в том, что запрос работает, когда я использую этот фильтр business_date IN ('2024-01-31', '2024-02-29', '2024-03-31'), но не работает, когда я использую business_date IN (SELECT business_date FROM dim_date); есть ли для этого какая-то особая причина?

Iren Ramadhan 19.07.2024 05:36

Кстати, я нашел ответ, который помогает моему запросу: stackoverflow.com/questions/67240620/…; но все еще не отвечает на мой вопрос выше.

Iren Ramadhan 19.07.2024 05:37
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java была сильно переработана начиная с версии Java 8 и далее с появлением библиотеки java.time.
0
5
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно ответу, опубликованному в ссылке на стек to limit the partitions that are scanned in a query, you need to use a constant expression to filter the partition column., ваш первый запрос удовлетворяет следующему условию, тогда как второй запрос может не удовлетворять этому условию, поскольку он может не быть константой. Таким образом, он выдает ошибку о фильтре по столбцам «business_date».

Я полагаю, что изменение запроса для поддержки этого условия может решить проблему.

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

Другие вопросы по теме