Ошибка BigQuery при получении коррелированных подзапросов — для получения предыдущего события

#database #google-bigquery

#База данных #google-bigquery

Вопрос:

У меня есть 2 таблицы BigQuery:

1- Срабатывает

 car     start                   end    
---------------------------------------------------
1       2019-03-13T17:07:00     2019-03-13T17:17:00
2       2019-03-13T17:07:00     2019-03-13T17:22:00
3       2019-03-13T17:07:00     2019-03-13T17:34:00
4       2019-03-13T17:07:00     2019-03-13T17:12:00
  

2- Отслеживание

 car     created_at              status  
--------------------------------------
1       2019-03-13T17:01:00     1
1       2019-03-13T17:02:00     1
1       2019-03-13T17:03:00     1
1       2019-03-13T17:04:00     1
1       2019-03-13T17:05:00     2
1       2019-03-13T17:06:00     2
1       2019-03-13T17:18:00     3
1       2019-03-13T17:19:00     3
1       2019-03-13T17:20:00     3
1       2019-03-13T17:21:00     3
1       2019-03-13T17:22:00     3
  

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

Мой подход до сих пор был:

 select *,
(select status created_at from tracking
  where car = tracking.car
  AND start > created_at
  order by created_at desc
  limit 1
) as previous_status
from trips
  

Но я получаю следующую ошибку:

 Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN.
  

Есть какие-нибудь подсказки о том, как переписать запрос для BigQuery?

Ответ №1:

Для получения предыдущего события используйте LAG() OVER() , как в:

 SELECT actor.login
  , type
  , LAG(type, 1) OVER(PARTITION BY actor.login ORDER BY created_at) prev_type
FROM `githubarchive.day.20190313` 
WHERE actor.login IN ('00aquir', '0123hoang')
LIMIT 100
  

введите описание изображения здесь