На прошлой неделе я вкидывала задачу. Мы ещё раз пообсуждали и вот на чем остановились:
1️⃣Делаем фулл джойн исходных витрин: view1, view1_1, ...
Идею с кросс джойнами мы решили оставить)
2️⃣Делим фулловую таблицу на n вьюшек, где n - это количество шагов. Начинаем с конца (последнего заполненного).
Пример:
when step1_2 is not null => v_step1_2 - новая вьюшка для строк, у которых есть степ1_2:
3 null null json
5 json null json
6 null json json
7 json json json3️⃣Делаем left anti join фулловой таблицы с созданной вьюшкой, получаем строки, которые не вошли:
1 json null null
2 null json null
4 json json null
Повторяем шаги 2 и 3 n раз.
NB! В следующих вьюшках количество столбцов уменьшается (исключаем уже выделенный степ)
1) when step1_1 is not null => v_step1_1
2 null json
4 json json
После left anti join обновленная фулловая:
1 json null nullНа последнем этапе просто берем id и первый столбец.
Итак, у нас 3 вьюшки с разным количеством столбцов.
️4️⃣Делаем coalesce(stepn, default_json)
5️⃣Делаем array(всех шагов) => получаем одинаковую структуру для всех вьюшек с полями id и array
6️⃣Union
🕺🕺🕺🕺🕺🕺🕺
