ОБНОВЛЕНИЕ: см. Комментарий Михаила.это не работаетЯ обновил запрос, чтобы BigQuery не проводил быструю оптимизацию.
Вот точное решение.Идея состоит в том, чтобы построить массив всех записей на станции и отфильтровать за прошедший час, используя коррелированный запрос.Обработка всего набора данных заняла 7 секунд.
Размер массива записей на станции должен быть <100 МБ.Сгруппируйте столько полей, сколько необходимо, чтобы сделать ваши массивы достаточно маленькими:) </p>
WITH all_hires AS (
SELECT
start_station_id
, ARRAY_AGG(STRUCT(duration,
start_date,
TIMESTAMP_SUB(start_date, INTERVAL 1 HOUR) AS start_date_m1h,
end_date)) AS hires
FROM `bigquery-public-data`.london_bicycles.cycle_hire
GROUP BY start_station_id
),
hires_by_ts AS (
SELECT
start_station_id
, h.start_date
, (SELECT AVG(duration) FROM UNNEST(hires)
WHERE end_date BETWEEN h.start_date_m1h AND h.start_date)
AS duration_prev_hour
, (SELECT COUNT(duration) FROM UNNEST(hires)
WHERE end_date BETWEEN h.start_date_m1h AND h.start_date)
AS numreturns_prev_hour
FROM
all_hires, UNNEST(hires) AS h
)
SELECT * from hires_by_ts
WHERE duration_prev_hour IS NOT NULL
ORDER BY duration_prev_hour DESC
LIMIT 5