Получить интервал дней из запроса
У меня есть запрос, который возвращает строки за определенные дни с помощью _TABLE_SUFFIX
вариант.
Мое предложение where изначально было таким:
WHERE _TABLE_SUFFIX
BETWEEN FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY)) AND
FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
Что работает, и как мне кажется, объем обрабатываемых данных составляет 139,5 МБ:
Дело в том, что я хочу, чтобы параметр "2" динамически загружался из таблицы, например:
WHERE _TABLE_SUFFIX
BETWEEN FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL
(select value from `path.to.days_interval_setting`) DAY)) AND
FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
Теперь, когда значение такое же (2) Согласно оценке, он будет обрабатывать 12,3 ГБ:
И на самом деле, похоже, это так, запрос занимает больше времени, но возвращаемые данные относятся к правильному количеству дней.
Я также попытался присоединиться к таблице вместо использования подзапроса, и он дал те же результаты.
Кто-нибудь знает, как мне исправить эту проблему?
1 ответ
ОК, я нашел здесь ответ
Фильтры в _TABLE_SUFFIX, которые включают подзапросы, не могут использоваться для ограничения количества таблиц, сканируемых на предмет наличия подстановочной таблицы. Например, следующий запрос не ограничивает сканирование таблиц на предмет наличия подстановочной таблицы bigquery-public-data.noaa_gsod.gsod19*
Чтобы ограничить его на основе условия, связанного с подзапросом, вы можете выполнить два отдельных запроса.
Первый запрос:
#standardSQL
# Get the list of tables that match the required table name prefixes
SELECT SUBSTR(MAX(table_id), LENGTH('gsod19') + 1)
FROM `bigquery-public-data.noaa_gsod.__TABLES_SUMMARY__`
WHERE table_id LIKE 'gsod194%'
Второй запрос:
#standardSQL
# Construct the second query based on the values from the first query
SELECT
ROUND((max-32)*5/9,1) celsius
FROM
`bigquery-public-data.noaa_gsod.gsod19*`
WHERE _TABLE_SUFFIX = '49'