2017-01-19 3 views
3

В настоящее время я работаю над запросом от этого post. Этот запрос написан в Legacy SQL и не будет работать в моей среде. Я изменил запрос на использование современных функций SQL и обновил SELECT date as date для использования timestamp_micros.BigQuery Ежемесячные активные пользователи?

Следует также упомянуть, что строки, которые я пытаюсь выбрать, поступают из Firebase Analytics.

Мой запрос:

SELECT 
    FORMAT_TIMESTAMP('%Y-%m-%d', TIMESTAMP_MICROS(event.timestamp_micros)) as date, 
    SUM(CASE WHEN period = 7 THEN users END) as days_07, 
    SUM(CASE WHEN period = 14 THEN users END) as days_14, 
    SUM(CASE WHEN period = 30 THEN users END) as days_30 
FROM (
    SELECT 
     FORMAT_TIMESTAMP('%Y-%m-%d', TIMESTAMP_MICROS(event.timestamp_micros)) as date, 
     periods.period as period, 
     COUNT(DISTINCT user_dim.app_info.app_instance_id) as users 
    FROM `com_sidearm_fanapp_uiowa_IOS.*` as activity 
    CROSS JOIN 
     UNNEST(event_dim) as event 
    CROSS JOIN (
     SELECT 
      FORMAT_TIMESTAMP('%Y-%m-%d', TIMESTAMP_MICROS(event.timestamp_micros)) as date 
     FROM `com_sidearm_fanapp_uiowa_IOS.*` 
     CROSS JOIN 
      UNNEST(event_dim) as event 
     GROUP BY event.timestamp_micros 
    ) as dates 
    CROSS JOIN (
     SELECT 
      period 
     FROM 
      (
       SELECT 7 as period 
       UNION ALL 
       SELECT 14 as period 
       UNION ALL 
       SELECT 30 as period 
      ) 
    ) as periods 
    WHERE 
     dates.date >= activity.date 
    AND 
     SAFE_CAST(FLOOR(TIMESTAMP_DIFF(dates.date, activity.date, DAY)/periods.period) AS INT64) = 0 
    GROUP BY 1,2 
) 
CROSS JOIN 
    UNNEST(event_dim) as event 
GROUP BY date 
ORDER BY date DESC 
+1

Для других, посещающих этот пост, экспорт BQ схемы определяется [здесь] (https://support.google.com/ firebase/ответ/7029846? гектолитров = еп & ref_topic = 7029512). – Kato

ответ

3

Column name period is ambiguous at [24:13] error.

исправить эту конкретную ошибку - вы должны исправить ниже

CROSS JOIN (
     SELECT 
      period 
     FROM 
      (SELECT 7 as period), 
      (SELECT 14 as period), 
      (SELECT 30 as period) 
    ) as periods 

поэтому он должен выглядеть следующим образом:

CROSS JOIN (
     SELECT 
      period 
     FROM 
      (SELECT 7 as period UNION ALL 
      SELECT 14 as period UNION ALL 
      SELECT 30 as period) 
    ) as periods 

Answer on your updated question

Попробуйте ниже. У меня не было возможности проверить это, но надеюсь, что это может помочь вам исправить ваш запрос

SELECT 
    date, 
    SUM(CASE WHEN period = 7 THEN users END) as days_07, 
    SUM(CASE WHEN period = 14 THEN users END) as days_14, 
    SUM(CASE WHEN period = 30 THEN users END) as days_30 
FROM (
    SELECT 
     activity.date as date, 
     periods.period as period, 
     COUNT(DISTINCT user) as users 
    FROM (
     SELECT 
      event.timestamp_micros as date, 
      user_dim.app_info.app_instance_id as user 
     FROM `yourTable` CROSS JOIN UNNEST(event_dim) as event 
    ) as activity 
    CROSS JOIN (
     SELECT 
      event.timestamp_micros as date 
     FROM `yourTable` CROSS JOIN UNNEST(event_dim) as event 
     GROUP BY event.timestamp_micros 
    ) as dates 
    CROSS JOIN (
     SELECT period 
     FROM 
      (SELECT 7 as period UNION ALL 
      SELECT 14 as period UNION ALL 
      SELECT 30 as period) 
    ) as periods 
    WHERE dates.date >= activity.date 
    AND SAFE_CAST(FLOOR(TIMESTAMP_DIFF(TIMESTAMP_MICROS(dates.date), TIMESTAMP_MICROS(activity.date), DAY)/periods.period) AS INT64) = 0 
    GROUP BY 1,2 
) 
GROUP BY date 
ORDER BY date DESC 
+0

Это работает, но теперь это еще одна ошибка: 'Имя даты не найдено внутри действия в [31:32]' –

+0

, как вы упомянули в своем вопросе - оригинальный запрос был написан для другой таблицы, в которой есть поле «date». поэтому вам нужно убедиться, что вы используете файл, который существует в вашей таблице. –

+0

Поля, которые я запрашиваю, существуют в моей таблице. Я уверен в этом. Я изменил 'date' на' timestamp_micros' –

Смежные вопросы