The query goes on without executing, any ideas on how I can help it resolve?
Using the Economy Data Atlas
dataset from Knoema
within Snowflake.
with payment as ( select * from DATA_WAREHOUSE.ANALYTICS.PAYMENTS ), fx_rates as ( select date("Date") as date, split("Currency Name", '/')[0] as from_currency, "Value" as rate from economy_data_atlas.economy.exratescc2018 where date > (select MIN(processed_at) from payment ) and from_currency in (select distinct target_currency from payment) and "Currency Unit" = 'USD' and "Indicator Name" = 'Close' and "Frequency" = 'D' ) select payment.payout_guid as payout_id, payment.status, payment.source_amount, IFF( source_currency = target_currency, source_amount, ROUND( payment.source_amount * source_fx_rates_usd.rate, 2 ) ) as source_amount_usd from payment left join fx_rates as source_fx_rates_usd on source_fx_rates_usd.date = date(payment.processed_at) and source_fx_rates_usd.from_currency = payment.source_currency
Advertisement
Answer
This might be a case where temporary tables will help your what I assume is a massive table be pruned (aka one of the reasons to avoid complex CTE’s)
I would re-write your SQL like:
with payment as ( select * ,date(payment.processed_at) as _payment_date from DATA_WAREHOUSE.ANALYTICS.PAYMENTS ), distinct_targets as ( select distinct target_currency from payment ), fx_rates as ( select date("Date") as date, split_part("Currency Name", '/', 0) as from_currency, "Value" as rate from economy_data_atlas.economy.exratescc2018 join distinct_targets dt on from_currency = dt.target_currency where date > ( select MIN(processed_at) from payment ) and "Currency Unit" = 'USD' and "Indicator Name" = 'Close' and "Frequency" = 'D' ) select p.payout_guid as payout_id, p.status, p.source_amount, IFF( source_currency = target_currency, source_amount, ROUND( p.source_amount * sfx.rate, 2 ) ) as source_amount_usd from payment as p left join fx_rates as sfx on sfx.date = p._payment_date and sfx.from_currency = p.source_currency left join fx_rates as tfx on tfx.date = p._payment_date and tfx.from_currency = p.target_currency
so I can understand it. And I notice that you join to fx_rates twice, but both are the exact same join logic. so tis 100% pointless.. and given tfx
is not used I would guess it’s that.
The next things to look at is how far through the data load your process is. To get an idea of how much more data there is to load.