Обновление : во время дальнейших экспериментов это мое лучшее решение:
SELECT SUM(views) views
FROM `fh-bigquery.wikipedia_v2.pageviews_2018`
WHERE DATE_TRUNC(DATE(datehour), month) = '2018-04-01'
По сути, это первая попытка в вопросе, плюс приведение метки времени к DATE, а затем применение DATE_TRUNC
.
Оставляя другие опции, которые я попробовал ниже, так как они могут быть полезны для других ситуаций.
Один вариант - использовать WITH для определения переменной, таким образом набирая месяцтолько один раз:
WITH month AS (SELECT DATE('2018-04-01') m),
full_month AS (SELECT m AS s, DATE_SUB(DATE_ADD(m, INTERVAL 1 MONTH), INTERVAL 1 DAY) AS e FROM month)
SELECT SUM(views) views
FROM `fh-bigquery.wikipedia_v2.pageviews_2018`
WHERE DATE(datehour)
BETWEEN (SELECT s FROM full_month) AND (SELECT e FROM full_month)
Аналогично, вы можете определить функции SQL UDF:
CREATE TEMPORARY FUNCTION month() AS (DATE('2018-04-01'));
CREATE TEMPORARY FUNCTION month_end() AS (DATE_SUB(DATE_ADD(month(), INTERVAL 1 MONTH), INTERVAL 1 DAY));
SELECT SUM(views) views
FROM `fh-bigquery.wikipedia_v2.pageviews_2018`
WHERE DATE(datehour) BETWEEN month() AND month_end()
Для обоих вариантов BigQuery может идентифицировать и оптимизировать сканирование только необходимых разделов.