Это обманчиво дорогим запроса; Анализ таймсеров всегда бывает трудным в подобных SQL-средах. Приведенный вами текст PARTITION BY
требует, чтобы все данные для одного extid присутствовали в памяти на одной машине, что перегружает его и приводит к превышению ваших ресурсов.
Вы можете уменьшить эту потребность в ОЗУ с помощью предложения ROWS
, чтобы ограничить область вашего раздела. Ниже приведен пример:
SELECT extid, stamp, ds, amount, note, balance
FROM (
SELECT
extid, stamp, ds, amount, note, balance,
MAX(tenth_stamp) OVER(PARTITION BY extid) AS target_stamp
FROM (
SELECT extid, stamp, ds, amount, note, balance,
MIN(stamp) OVER (
PARTITION BY extid
ORDER BY stamp DESC
ROWS BETWEEN CURRENT ROW AND 9 FOLLOWING
) AS tenth_stamp
FROM
[monte.ledger2_trailing_21d]
WHERE ds >= '2015-02-09'
)
)
WHERE stamp >= target_stamp
ORDER BY extid, stamp
LIMIT 300
самого внутреннего суб-выбора извлекает ваши данные и поле tenth_stamp
, который содержит наименьшее печать 10 рядов исследованных. Использование MIN()
делает эту работу даже тогда, когда для любого заданного extid
существует менее 10 строк.
Средний подвыбор найден наибольшим tenth_stamp
за каждые extid
. Это десятый общий штамп для этого extid
. Внешний SELECT затем может ограничивать результат только строками с stamp
в десяти последних stamp
для их соответствующих extid
, что дает желаемый результат.
Выполняется в общей сложности 4 этапа. Он не будет работать быстро, но никогда не требует больших объемов данных в одном месте. Надеюсь, это поможет!
Спасибо, что указали предложение Rows. Мне все еще нужно было сделать row_number во внешнем запросе, чтобы проанализировать порядок взаимодействия пользователей с событиями, но теперь он работает без проблем. Кроме того, вы могли бы отредактировать мою учетную информацию из своего ответа. Я бы предпочел не иметь полный путь к файлу, указанный в открытом форуме. – PData
FYI Matthew - инженер BigQuery, имеющий доступ к журналам запросов, на случай, если вам интересно, как он нашел ваш идентификатор проекта (и непреднамеренно добавил его к ответу). –