Files
airflow-greenplum/sql/dds/dim_tariffs_load.sql
ddadmin e29a249830 docs(dds): добавлены учебные комментарии о генерации SK
- Зачем:
  - объяснить студентам, почему подход MAX() + ROW_NUMBER() безопасен только при последовательном запуске.
- Что:
  - добавлен комментарий в dim_airplanes_load.sql.
  - добавлен комментарий в dim_airports_load.sql.
  - добавлен комментарий в dim_passengers_load.sql.
  - добавлен комментарий в dim_routes_load.sql.
  - добавлен комментарий в dim_tariffs_load.sql.
- Проверка:
  - git diff HEAD~1 sql/dds/.
2026-03-01 17:42:42 +03:00

41 lines
1.2 KiB
SQL

-- Загрузка DDS dim_tariffs: SCD1 UPSERT (INSERT новых тарифов).
WITH src AS (
SELECT DISTINCT
s.fare_conditions
FROM ods.segments AS s
WHERE s.fare_conditions IS NOT NULL
AND s.fare_conditions <> ''
),
-- Учебный комментарий: Генерация SK через MAX() + ROW_NUMBER()
-- Этот подход работает безопасно только потому, что Airflow запускает
-- джобы загрузки для одной таблицы строго последовательно (concurrency=1).
-- При параллельной загрузке возникнет состояние гонки (race condition) и возможны дубли SK.
max_sk AS (
SELECT COALESCE(MAX(tariff_sk), 0) AS v
FROM dds.dim_tariffs
)
INSERT INTO dds.dim_tariffs (
tariff_sk,
fare_conditions,
created_at,
updated_at,
_load_id,
_load_ts
)
SELECT
(SELECT v FROM max_sk) + ROW_NUMBER() OVER (ORDER BY s.fare_conditions)::INTEGER,
s.fare_conditions,
now(),
now(),
'{{ run_id }}',
now()
FROM src AS s
WHERE NOT EXISTS (
SELECT 1
FROM dds.dim_tariffs AS d
WHERE d.fare_conditions = s.fare_conditions
);
ANALYZE dds.dim_tariffs;