Таким образом, цель состоит в том, чтобы обновить таблицу fact
и установить поле init_date
равным самым ранним startdate
в промежуточной таблице, где поля sk_c_id
, sk_p_id
и lot
в промежуточном совпадении строка обновляется в fact
.
Давайте начнем с получения минимального startdate
для данной компании, продукта и лота:
SELECT sk_c_id, sk_p_id, lot, MIN(startdate) as min_start_date
FROM staging
JOIN company c USING (c_id)
JOIN product p USING (p_id)
GROUP BY sk_c_id, sk_p_id, lot
Чтобы проверить это, мы можем присоединить его к таблице fact
и посмотреть, как будет выглядеть окончательный результат:
SELECT
f.*,
s.min_start_date
FROM fact f
JOIN (SELECT sk_c_id, sk_p_id, lot, MIN(startdate) as min_start_date
FROM staging
JOIN company c USING (c_id)
JOIN product p USING (p_id)
GROUP BY sk_c_id, sk_p_id, lot
) s USING (sk_c_id, sk_p_id, lot)
Результат получается как:
3 1 1 88 2019-03-09 2019-03-07
2 1 1 88 2019-03-08 2019-03-07
1 1 1 88 2019-03-17 2019-03-07
7 1 5 66 2018-08-08 2018-08-08
5 2 3 88 2019-03-08 2019-03-08
4 3 4 66 2019-02-08 2019-02-08
Обратите внимание, что эти результаты показывают 2019-03-07
как минимум startdate
для 1, 1, 88
. Это отличается от вашего образца вывода 2019-03-08
, но я думаю, что ваша дата выборки была на самом деле неверна.
Тогда нужно преобразовать его в UPDATE
выражение:
UPDATE fact
SET init_date = min_start_date
FROM (SELECT sk_c_id, sk_p_id, lot, MIN(startdate) as min_start_date
FROM staging
JOIN company c USING (c_id)
JOIN product p USING (p_id)
GROUP BY sk_c_id, sk_p_id, lot
) s
WHERE fact.sk_c_id = s.sk_c_id
AND fact.sk_p_id = s.sk_p_id
AND fact.lot = s.lot
Обратите внимание, что при использовании UPDATE
в строке Amazon Redshift помечает существующую строку как Удалено и создает новую строку в конце области хранения для каждого столбца. Таким образом, хранилище становится фрагментированным и выходит из строя.
Поэтому рекомендуется выполнить VACCUUM
на столе после выполнения UPDATE
.
Также было бы неплохо сделать резервную копию (снимок) перед выполнением UPDATE
на случай непреднамеренной перезаписи данных.