-- Загрузка инкремента из stg.flights_ext в stg.flights. -- Окно инкремента определяется по event_ts: -- берём строки, где scheduled_departure больше максимального event_ts -- среди "старых" батчей; верхняя граница по дате не используется. -- CTE для определения максимальной даты загрузки предыдущего батча WITH max_batch_ts AS ( SELECT COALESCE(MAX(event_ts), TIMESTAMP '1900-01-01 00:00:00') AS max_ts FROM stg.flights WHERE _load_id <> '{{ run_id }}'::text OR _load_id IS NULL ) INSERT INTO stg.flights ( flight_id, route_no, status, scheduled_departure, scheduled_arrival, actual_departure, actual_arrival, event_ts, _load_ts, _load_id ) SELECT ext.flight_id::text, ext.route_no::text, ext.status::text, ext.scheduled_departure::text, ext.scheduled_arrival::text, ext.actual_departure::text, ext.actual_arrival::text, ext.scheduled_departure::timestamp, now(), '{{ run_id }}'::text FROM stg.flights_ext AS ext CROSS JOIN max_batch_ts AS mb WHERE ext.scheduled_departure > mb.max_ts AND NOT EXISTS ( -- Идемпотентность: при повторном запуске/ретрае не вставляем повторно те же строки в рамках текущего _load_id. SELECT 1 FROM stg.flights AS f WHERE f._load_id = '{{ run_id }}'::text AND f.flight_id = ext.flight_id::text ); -- Обновляем статистику для оптимизатора Greenplum -- Это критично для корректной работы оптимизатора и выбора оптимального плана выполнения ANALYZE stg.flights;