2016-09-10 4 views
1

Я пытаюсь получить список клиентов, совершивших хотя бы одну покупку в определенный день. При работе с подписью под номером bigquery ниже вы выбираете дату и customer_id. Тем не менее, город всегда возвращает null, хотя я знаю, что данные существуют.Выбор пользовательских измерений с большим количеством ударов с помощью bigquery

Нужно ли использовать другой подход при выборе нескольких пользовательских измерений с ограниченным доступом?

SELECT date 
,CASE WHEN hits.customdimensions.index = 5 
THEN hits.customdimensions.value END as customer_id 
,CASE WHEN hits.customdimensions.index = 50 
THEN hits.customdimensions.value END as city 
FROM (TABLE_DATE_RANGE([16475821.ga_sessions_], 
     TIMESTAMP('2016-09-01'), TIMESTAMP('2016-09-07')) 
GROUP BY 1, 2, 3 
HAVING sum(case when hits.eventInfo.eventAction = 'purchase' then 1 end) > 0 
     and customer_id is not null 

ответ

1

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

SELECT 
    date, 
    MAX(CASE WHEN hits.customdimensions.index = 5 
      THEN hits.customdimensions.value END) WITHIN RECORD AS customer_id 
    MAX(CASE WHEN hits.customdimensions.index = 50 
      THEN hits.customdimensions.value END) WITHIN RECORD AS city 
    SUM(CASE WHEN hits.eventInfo.eventAction = 'purchase' 
      THEN 1 END) WITHIN RECORD AS purchases_count 
FROM (TABLE_DATE_RANGE([16475821.ga_sessions_], 
     TIMESTAMP('2016-09-01'), TIMESTAMP('2016-09-07'))) 
HAVING purchases_count > 0 
AND NOT customer_id IS NULL 
+0

Works! Какова рациональность учета рекордных агрегатов? – Kieran

+1

Это способ извлечь необходимые вложенные элементы из каждой записи (строки). Используя max(), вы эффективно «извлекаете» только то, что вам нужно, и игнорируете отдых. И используя sum() вы считаете покупки внутри записи. Вот как я увидел ваши данные и соответственно написал запрос –