Решение, о котором говорилось выше, очень специфично для BigQuery: в нем есть некоторые причуды, которые вам нужно обойти, например, ошибка памяти, которую вы получили.
Однажды я ответил на похожий вопрос здесь , который более переносим и проще в обслуживании.
По сути, вам нужно создать таблицу меньшего размера (еще лучше сделать ее представлением) с идентификатором, и это будет первая транзакция. Это похоже на то, что вы поделили немного по-другому, поскольку вам нужно сгруппировать ТОЛЬКО в самом верхнем запросе.
Это выглядит примерно так
select
# contact ids that are first time contacts
b.id as cont_id,
b.accountid
from `sfdccontacttable` as b inner join
( select accountid,
min(createddate) as first_tx_time
FROM `sfdccontacttable`
group by 1) as a on (a.accountid = b.accountid and b.createddate = a.first_tx_time)
group by 1, 2
Вам необходимо сделать это таким образом, потому что в противном случае вы можете получить несколько идентификаторов для каждой учетной записи (если с этим связаны другие измерения). Таким образом, это своего рода перспектива на будущее, поскольку вы можете добавить несколько измерений в базовые таблицы, не влияя на результат, а также вы можете использовать предложение where
во внутреннем запросе, чтобы определить «действительный» контакт и так далее. Затем вы можете сохранить его как представление и просто сослаться на него в любом подзапросе или операции соединения