Поскольку вы используете productSku
и productListName
в качестве измерений / групп, перекрестное соединение с массивом product
невозможно.
Вы также перекрестно соединяетесь с product
, который можетбыть опасным, потому что иногда этот массив отсутствует, и вы уничтожаете всю строку - обычно вы используете левое соединение.Но в этом случае это нормально, потому что вас интересуют только поля продукта.
Однако вы должны четко понимать, хотите ли вы видеть клики в списке или показы в списке, используя hits.product.isImpression
и hits.product.isClick
.Я не вижу различий там.Может быть, фильтр для WHERE hits_product.isImpression
в случае представления списка?
Вместо осколков вы можете рассмотреть возможность добавления поля даты и PARTITION BY date
, а также CLUSTER BY list_name
.См. Оператор INSERT для обновления и Синтаксис DDL для запуска таблицы.Это более производительно, чем осколки, когда дело доходит до запроса таблицы позже.
Запуск таблицы может выглядеть примерно так:
CREATE TABLE `x.y.z`
PARTITION BY date
CLUSTER BY list_name
AS (
SELECT
PARSE_DATE('%Y%m%d',date) AS date,
device.devicecategory AS device,
hits_product.productListName AS list_name,
UPPER(hits_product.productSKU) AS SKU,
AVG(IF(hits_product.isClick, hits_product.productListPosition, NULL)) AS avg_plp_click_position,
AVG(IF(hits_product.isImpression, hits_product.productListPosition, NULL)) AS avg_plp_view_position
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20*` AS t
CROSS JOIN UNNEST(hits) AS hits
CROSS JOIN UNNEST(hits.product) AS hits_product
WHERE
parse_date('%y%m%d', _table_suffix)
between
DATE_sub(current_date(), interval 1 day)
and DATE_sub(current_date(), interval 1 day)
AND hits_product.productListName != "(not set)"
GROUP BY
date,
device,
list_name,
SKU
)
Вставка новых записей очень похожа, вам просто нужноупомяните поля заранее, как описано в документации.