#sql #snowflake-cloud-data-platform #snowflake-schema
Вопрос:
У меня есть две таблицы, TBL_A и TBL_B.
TBL_A выглядит так:
TBL_B выглядит так:
Мне нужно обновить TBL_B на основе информации, найденной в TBL_A для ДАТЫ и времени, которая соответствует определенному статусу, поэтому:
when status = 'CLAIMED' put DATETIME in CLAIMED_DATETIME
when status = 'BOUGHT' put DATETIME in BOUGHT_DATETIME
when status = 'RETURNED' put DATETIME in RETURNED_DATETIME
У меня есть такой запрос:
MERGE INTO TBL_B B
USING (
SELECT * FROM TBL_A
PIVOT(MIN(ACCOUNT_REWARD_UPDATED_AT_DATETIME) FOR ACCOUNT_REWARD_STATUS IN ('claimed', 'bought', 'returned'))
AS P (number_id, country, amount, currency, file_tp, ingestion_time, claimed, bought, returned)
) A ON (
A.number_id = B.number_id,
and A.country = B.country,
and A.amount = B.amount,
and A.currency = B.currency,
and A.file_tp = B.file_tp
and A.ingestion_time = B.ingestion_time
)
WHEN MATCHED THEN
UPDATE SET
B.CLAIMED_DATETIME = IFF(A.claimed IS NOT NULL, A.claimable , '2999-12-31 23:59:5'),
B.BOUGHT_DATETIME = IFF(A.bought IS NOT NULL, A.claimed , '2999-12-31 23:59:5'),
B.RETURNED_DATETIME = IFF(A.reverted IS NOT NULL, A.reverted, '2999-12-31 23:59:5');
Когда я присоединяюсь ко ВСЕМ столбцам, file_tp и ingestion_time различаются для каждого статуса (заявлен, куплен и возвращен), а остальные столбцы одинаковы для каждого статуса. Когда я запускаю запрос выше, он обновляет только 1 ДАТУ, а не все из них. Я понял, что это потому, что я не могу присоединиться к FILE_TP и INGESTION_TIME, так как они разные для каждого статуса. ОДНАКО, когда я удаляю их из условия соединения, я получаю сообщение об ошибке:
MERGE INTO TBL_B B
USING (
SELECT * FROM TBL_A
PIVOT(MIN(DATETIME) FOR STATUS IN ('claimed', 'bought', 'returned'))
AS P (number_id, country, amount, currency, file_tp, ingestion_time, claimed, bought, returned)
) A ON (
A.number_id = B.number_id,
and A.country = B.country,
and A.amount = B.amount,
and A.currency = B.currency,
--and A.file_tp = B.file_tp
--and A.ingestion_time = B.ingestion_time
)
WHEN MATCHED THEN
UPDATE SET
B.CLAIMED_DATETIME = IFF(A.claimed IS NOT NULL, A.claimable , '2999-12-31 23:59:5'),
B.BOUGHT_DATETIME = IFF(A.bought IS NOT NULL, A.claimed , '2999-12-31 23:59:5'),
B.RETURNED_DATETIME = IFF(A.reverted IS NOT NULL, A.reverted, '2999-12-31 23:59:5');
ошибка:
Duplicate row detected during DML action Row Values:
Кто-нибудь знает, как я могу это исправить?
Комментарии:
1. «Когда я выполняю приведенный выше запрос, он обновляет только 1 ДАТУ, а не все» — вы имеете в виду, что необходимо обновить несколько строк, которые имеют одинаковое значение (number_id, страна, сумма, валюта)?
Ответ №1:
Я подозреваю, что стержень делает не то, что вы от него ожидаете, — проверяет свои результаты.
Попробуйте изменить это:
SELECT * FROM TBL_A
PIVOT(MIN(DATETIME) FOR STATUS IN ('claimed', 'bought', 'returned'))
AS P (number_id, country, amount, currency, file_tp, ingestion_time, claimed, bought, returned)
) A ON (
A.number_id = B.number_id,
and A.country = B.country,
and A.amount = B.amount,
and A.currency = B.currency,
--and A.file_tp = B.file_tp
--and A.ingestion_time = B.ingestion_time
к этому:
SELECT *
FROM (select number_id, country, amount, currency from TBL_A)
PIVOT(MIN(DATETIME) FOR STATUS IN ('claimed', 'bought', 'returned'))
AS P (number_id, country, amount, currency, claimed, bought, returned)
) A ON (
A.number_id = B.number_id,
and A.country = B.country,
and A.amount = B.amount,
and A.currency = B.currency,
Комментарии:
1. Всем привет! Да, я пробовал это изначально, однако, когда я помещаю первичные ключи и не включаю те, которые мне нужны, это портит весь заказ. В нем будут указаны все значения, соответствующие file_tp, и так далее.
2. поэтому, если у меня есть P как (number_id, страна, сумма, валюта, заявленная, купленная, возвращенная), то он захватывает все столбцы в исходной таблице и устанавливает их в соответствии с тем, что у меня есть в списке, независимо от значения
3. Если вам нужна дополнительная помощь, вам нужно будет предоставить нам некоторые примеры данных и то, как должны выглядеть желаемые результаты — будьте, пожалуйста, откровенны в том, как текущий запрос не выполняется.