добавочная загрузка с новым + обновление без удаления в столбцах красного смещения, которые обновляются в разное время - PullRequest
0 голосов
/ 21 ноября 2018

В качестве примера у меня есть следующие таблицы:

  1. Events(id, business_uuid, event_category, event_name, created, row_updated)
  2. Bank_accounts(id, business_uuid, bank_name, Account_no, etc, created, row_updated)
  3. 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-заявления

...