В качестве примера у меня есть следующие таблицы:
Events(id, business_uuid, event_category, event_name, created,
row_updated)
Bank_accounts(id, business_uuid, bank_name, Account_no, etc, created, row_updated)
orders (id, uuid, business_uuid, qty, item, created, row_updated)
где созданы и row_updated являются временными метками.для каждого бизнеса я хочу, чтобы в первый раз что-то происходило с этим бизнесом в каждой таблице.Я на красном смещении.У меня есть мой запрос вроде:
with universal as(
select business_uuid from events
union
select business_uuid from bank_accounts
union
select business_uuid from orders
)
, ev as(
select business_uuid
, min(case when name = 'created_account' then created end) as created_account
, min(case when name = 'enter_business_detail' then created end) as enter_business_detail
, min(case when name = 'accepted_terms' then created end) as accepted_terms
from events
group by 1
)
, bank as(
select business_uuid
, min(row_updated) as entered_banking_details
from Bank_accounts
group by 1
)
, od as(
select business_uuid
, min(created) as first_order
from orders
group by 1
)
select u.business_uuid
natural left join ev
natural left join bank
natural left join od
, который дает мне вывод: result(business_uuid, created_account,enter_business_detail, accepted_terms, entered_banking_details,first_order)
способ, которым эти события происходят, когда они могут заполняться в разное время, если я извлекаю данные каждые 10 минут, некоторые столбцы будут нулевыми и позже будут заполнены, я имею дело с большой таблицей и не могу делать полную загрузку каждый раз, я хотел бы делать добавочную загрузку (new + update)и, надеюсь, не удалить.Я ввел столбец last_update
здесь result(business_uuid, created_account,enter_business_detail, accepted_terms, entered_banking_details,first_order, last update)
и переписал приведенный выше запрос следующим образом:
with universal as(
select business_uuid from events
union
select business_uuid from bank_accounts
union
select business_uuid from orders
)
, ev as(
select business_uuid
, min(case when name = 'created_account' then created end) as created_account
, min(case when name = 'enter_business_detail' then created end) as enter_business_detail
, min(case when name = 'accepted_terms' then created end) as accepted_terms
from events
where row_updated > (select max(last_updated) from result)
group by 1
)
, bank as(
select business_uuid
, min(row_updated) as entered_banking_details
from Bank_accounts
where row_updated > (select max(last_updated) from result)
group by 1
)
, od as(
select business_uuid
, min(created) as first_order
from orders
where row_updated > (select max(last_updated) from result)
group by 1
)
select u.business_uuid
natural left join ev
natural left join bank
natural left join od
Не получается, когда я сравниваю свою полную нагрузку с попыткой дополнительной загрузки, есть небольшая разница вколичество строк.
если вы найдете вышеупомянутое в ясной форме, я хотел бы получить совет о том, как лучше всего его решить.
для получения дополнительной информации, я использую Apache-Airflow в качестве инструмента ETLвыполнить мои SQL-заявления