#sql #google-cloud-platform #google-bigquery
#sql #google-облачная платформа #google-bigquery
Вопрос:
Поскольку это данные клиента, я заменил в этом сообщении имя проекта и имя набора данных на ******)
Я пытаюсь создать новый запрос расписания в BigQuery на облачной платформе Google Проблема в том, что у меня эта ошибка в редакторе веб-запросов
Cannot query over table '******.raw_bounce_rate' without a filter over column(s) 'dt' that can be used for partition elimination
Дело в том, что я фильтрую столбец dt.
Вот схема моей внешней секционированной таблицы
Tracking_Code STRING
Pages STRING NULLABLE
Clicks_to_Page INTEGER
Path_Lengths INTEGER
Visit_Number INTEGER
Visitor_ID STRING
Mobile_Device_Type STRING
All_Visits INTEGER
dt DATE
dt — это поле раздела, и я выбрал опцию «Требовать фильтрации разделов»
Вот упрощенный sql моего запроса
WITH yesterday_raw_bounce_rate AS (
SELECT *
FROM `******.raw_bounce_rate`
WHERE dt = DATE_SUB(@run_date, INTERVAL 1 DAY)
),
entries_table as (
SELECT dt,
ifnull(Tracking_Code, "sans campagne") as tracking_code,
ifnull(Pages, "page non trackée") as pages,
Visitor_ID,
Path_Lengths,
Clicks_to_Page,
SUM(all_visits) AS somme_visites
FROM
yesterday_raw_bounce_rate
GROUP BY
dt,
Tracking_Code,
Pages,
Visitor_ID,
Path_Lengths,
Clicks_to_Page
HAVING
somme_visites = 1 and Clicks_to_Page = 1
)
select * from entries_table
если я удалю инструкцию
Clicks_to_Page = 1
или, если я заменю
DATE_SUB(@run_date, INTERVAL 1 DAY)
по жестко заданной дате
запрос принимается Big Query, для меня это не имеет смысла
Ответ №1:
В настоящее время здесь остается открытая проблема. Он устраняет ошибку, связанную с использованием фильтра @run_date в фильтре запланированных запросов к секционированным таблицам с требуемым фильтром. Команда инженеров в настоящее время работает над этим, хотя нет ETA.
В запланированном запросе вы можете использовать один из двух обходных путей, используя @run_date .Следующим образом:
Первый вариант,
DECLARE runDateVariable DATE DEFAULT @run_date;
#your code...
WHERE date = DATE_SUB(runDateVariable, INTERVAL 1 DAY)
Второй вариант,
DECLARE runDateVariable DATE DEFAULT CAST(@run_date AS DATE);
#your code...
WHERE date = DATE_SUB(runDateVariable, INTERVAL 1 DAY)
Кроме того, вы также можете использовать CURRENT_DATE() вместо @run_date, как показано ниже:
DECLARE runDateVariable DATE DEFAULT CURRENT_DATE();
#your code...
WHERE date = DATE_SUB(runDateVariable, INTERVAL 1 DAY)
Обновить
Я настроил другой запланированный запрос для ежедневного выполнения с таблицей, разделенной по ДАТЕ из вызываемого поля date_formatted
, и требуется фильтр разделов. Затем я настроил здесь обратную засыпку, чтобы я мог видеть результат запланированного запроса за предыдущие дни. Ниже приведен код, который я использовал:
DECLARE runDateVariable DATE DEFAULT @run_date;
SELECT @run_date as run_date, date_formatted, fullvisitorId FROM `project_id.dataset.table_name` WHERE date_formatted > DATE_SUB(runDateVariable, INTERVAL 1 DAY)
Комментарии:
1. на самом деле ничего из этого не работает, в двух первых вариантах все еще есть ошибки «Необъявленные параметры запроса», а последний не работает с обратной засыпкой
2. Вы должны настроить запрос расписания, чтобы переменная @run_date была распознана. Я только что установил uo запланированный запрос и выполнил обратную засыпку, и это сработало. Я добавил код, который использовал в разделе ОБНОВЛЕНИЯ ответа.
3. Вы выбрали опцию «Требовать фильтрации разделов» ?
4. Да, я сделал. Кроме того, схема моей таблицы была:
date_formatted as DATE and fullvisitorId as INT64
. Вы пробовали в качестве последнего комментария, который я опубликовал в ответе?5. Хм, спасибо, но это решение не работает для меня. У меня есть ОБЪЯВИТЬ ВРЕМЕННУЮ МЕТКУ runTimeVariable ПО УМОЛЧАНИЮ @run_time; … ВЫБЕРИТЕ .. ГДЕ insert_timestamp> timestamp_sub(переменная времени выполнения, ИНТЕРВАЛ 7 ДНЕЙ), и я все еще вижу ошибку: невозможно выполнить запрос по таблице… без фильтра по столбцам ‘insert_timestamp’, который можно использовать для удаления разделов