У меня проблема с этим запросом.

SELECT event_date, country, COUNT(*) AS sessions,
       AVG(length) AS average_session_length
  FROM (

SELECT country, event_date, global_session_id,
       (MAX(event_timestamp) - MIN(event_timestamp))/(60 * 1000 * 1000) AS length
  FROM (
SELECT user_pseudo_id,
       event_timestamp,
       country,
       event_date,
       SUM(is_new_session) OVER (ORDER BY user_pseudo_id, event_timestamp) AS global_session_id,
       SUM(is_new_session) OVER (PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS user_session_id
  FROM (
       SELECT *,
              CASE WHEN event_timestamp - last_event >= (30*60*1000*1000) 
                     OR last_event IS NULL 
                   THEN 1 ELSE 0 END AS is_new_session
         FROM (
              SELECT user_pseudo_id,
                     event_timestamp,
                     geo.country,
                     event_date,
                     LAG(event_timestamp,1) OVER (PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS last_event
                FROM `xxx.events*`
              ) last
       ) final
       ) session
 GROUP BY global_session_id, country, event_date

       ) agg
WHERE length >= (10/60)
group by country, event_date

Google Cloud Console выдает эту ошибку

Resources exceeded during query execution: The query could not be executed in the allotted memory.

Я знаю, что это, вероятно, проблема с предложениями OVER, но я не знаю, как отредактировать запрос, чтобы получить те же результаты. Я был бы благодарен за некоторую помощь. Спасибо вам, ребята!

2
Brozen 19 Дек 2019 в 17:40

1 ответ

Если бы мне пришлось угадывать, это такая строка:

  SUM(is_new_session) OVER (ORDER BY user_pseudo_id, event_timestamp) AS global_session_id,

Я бы порекомендовал изменить код так, чтобы «глобальный» идентификатор сессии был действительно локальным для каждого пользователя:

  SUM(is_new_session) OVER (PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS global_session_id,

Если вы скорректируете запрос, и это в основном работает, тогда проблема с ресурсами устранена. Следующим шагом будет выяснить, как получить глобальный идентификатор, который вы хотите. Самое простое решение - использовать локальный идентификатор для каждого пользователя.

1
Gordon Linoff 19 Дек 2019 в 18:08