Bigquery новая схема - Session-Duration Distribution-table в Firebase - PullRequest
0 голосов
/ 21 сентября 2018

Вот результат, который я хочу получить

Это Bigquery в соответствии со старой схемой и отлично работает в старой таблице источника данных.Вот запрос по старой схеме.Предполагается, что это даст мудрое распределение продолжительности сеанса, что означает, что оно даст мудрое количество сеансов (в секундах) (например, в изображении ниже).

 select (case when engagement_time1 > 0 and engagement_time1 <= 30 then "0-30" else
(case when engagement_time1 > 30 and engagement_time1 <= 60 then "31-60" else 
(case when engagement_time1 > 60 and engagement_time1 <= 180 then "61-180" else
(case when engagement_time1 > 180 and engagement_time1 <= 300 then "181-300" else
(case when engagement_time1 > 300 and engagement_time1 <= 600 then "301-600" else
(case when engagement_time1 > 600 and engagement_time1 <= 1800 then "601-1800" else 
(case when engagement_time1 > 1800 then "1800+" else
"0" end) end) end) end) end) end) end) 
 as engagement_bracket_in_seconds,
count(*) total_sessions
, sum(engagement_time1) total_engagement_time
from
(
SELECT app_instance_id, sess_id, MIN(min_time) sess_start, MAX(max_time) sess_end, COUNT(*) records, MAX(sess_id) OVER(PARTITION BY app_instance_id) total_sessions,
   (ROUND((MAX(max_time)-MIN(min_time))/(1000*1000),1)) sess_length_seconds,
       sum(case when name = "user_engagement" then engagement_time else 0 end)/1000 engagement_time1

FROM (
  SELECT *, SUM(session_start) OVER(PARTITION BY app_instance_id ORDER BY min_time) sess_id
  FROM (
    SELECT *, IF(
                previous IS null 
                OR (min_time-previous)>(30*60*1000*1000),  # sessions broken by this inactivity 
                1, 0) session_start 
                #https://blog.modeanalytics.com/finding-user-sessions-sql/
    FROM (
      SELECT *, LAG(max_time, 1) OVER(PARTITION BY app_instance_id ORDER BY max_time) previous
      FROM (
        SELECT user_dim.app_info.app_instance_id
          , (SELECT MIN(timestamp_micros) FROM UNNEST(event_dim)) min_time
          , (SELECT MAX(timestamp_micros) FROM UNNEST(event_dim)) max_time,
                event.name,
                params.value.int_value engagement_time
        FROM `firebase-analytics-sample-data.ios_dataset.app_events_20160601`,
        UNNEST(event_dim) as event,
        UNNEST(event.params) as params,
        UNNEST(user_dim.user_properties) as user_params
        where (event.name = "user_engagement" and params.key = "engagement_time_msec")
        and
                (user_params.key = "access" and user_params.value.value.string_value = "true") and
                PARSE_DATE('%Y%m%d', event.date) >= date_sub("{{upto_date (yyyy-mm-dd)}}", interval {{last n days}} day) and
                PARSE_DATE('%Y%m%d', event.date) <= "{{upto_date (yyyy-mm-dd)}}"
      )
    )
  )
)
GROUP BY 1, 2

) where sess_id > 0
group by 1
ORDER BY (total_engagement_time/total_sessions)

Результат старого запроса верный и показан на рисунке ниже

Нажмите, чтобы увидеть результат здесь

Схема AS Bigquery имеетбыл изменен, поэтому я попытался реплицировать старый запрос в соответствии с новой схемой и также изменил таблицу источника данных (которая, я уверен, что все события регистрируются в этой таблице).

Теперь строки кода, которые я добавил (в соответствии с новой схемой), заменяют некоторую часть старого запроса, и я выполняю его в целом, он также работает.

* добавленная часть (в соответствии с новой схемой)*

SELECT L.user_pseudo_id as app_instance_id ,R.min_time min_time,R.max_time max_time,L.event_name,L.eng_time engagement_time FROM  
              (SELECT  user_pseudo_id 
                        ,event_name
                        ,params.value.int_value eng_time
                    FROM `new_abc_datasource`,
                    UNNEST(event_params) as params,
                    UNNEST(user_properties) as user_params
                    where (event_name = "user_engagement" and params.key = "engagement_time_msec")
                    and
                            (user_params.key = "access" and user_params.value.string_value = "true") and
                            PARSE_DATE('%Y%m%d', event_date) >= date_sub("{{upto_date (yyyy-mm-dd)}}", interval {{last n days}} day) and
                            PARSE_DATE('%Y%m%d', event_date) <= "{{upto_date (yyyy-mm-dd)}}"
               ) as L 
               left join (SELECT  user_pseudo_id 
                       , MIN(event_timestamp) AS min_time
                      ,MAX(event_timestamp) AS max_time
                    FROM `analytics_151475732.events_*`,
                    UNNEST(event_params) as params,
                    UNNEST(user_properties) as user_params
                    where (event_name = "user_engagement" and params.key = "engagement_time_msec")
                    and
                            (user_params.key = "access" and user_params.value.string_value = "true") and
                            PARSE_DATE('%Y%m%d', event_date) >= date_sub("{{upto_date (yyyy-mm-dd)}}", interval {{last n days}} day) and
                            PARSE_DATE('%Y%m%d', event_date) <= "{{upto_date (yyyy-mm-dd)}}"
                    GROUP BY user_pseudo_id) as R 
                ON L.user_pseudo_id=R.user_pseudo_id

* заменить часть старого запроса *

 SELECT user_dim.app_info.app_instance_id 
          , (SELECT MIN(timestamp_micros) FROM UNNEST(event_dim)) min_time
          , (SELECT MAX(timestamp_micros) FROM UNNEST(event_dim)) max_time,
                event.name,
                params.value.int_value engagement_time
        FROM `firebase-analytics-sample-data.ios_dataset.app_events_20160601`,
        UNNEST(event_dim) as event,
        UNNEST(event.params) as params,
        UNNEST(user_dim.user_properties) as user_params
        where (event.name = "user_engagement" and params.key = "engagement_time_msec")
        and
                (user_params.key = "access" and user_params.value.value.string_value = "true") and
                PARSE_DATE('%Y%m%d', event.date) >= date_sub("{{upto_date (yyyy-mm-dd)}}", interval {{last n days}} day) and
                PARSE_DATE('%Y%m%d', event.date) <= "{{upto_date (yyyy-mm-dd)}}"

Проблема в новом результате, количество total_sessions резко сократилось.Может ли кто-нибудь, пожалуйста, направить меня, говоря: это правильная репликация старого запроса?потому что результат, который я получаю, отличается от результата, который давал старый.

...