【问题标题】:BigQuery, NULL values when joining transactions and currency exchange tablesBigQuery,连接交易和货币兑换表时的 NULL 值
【发布时间】:2021-05-20 23:30:15
【问题描述】:

我需要将表格中显示的过去 3 年的交易进口转换为欧元。为此,我使用了一个单独的表格,其中包含转换值。所以我需要加入这两个表,将正确的转换率附加到第一个表。 费率表有两个字段(valid_from 和 valid_to),其中包含过去 3 年的费率。因此,我必须在正确的时间附上正确货币的汇率(对于欧元,我们有一个单一汇率 = 1)。 这是我建立的查询:

select * 
from(SELECT date_trx, view_currency FROM transactions_table) transactions
left join
    (SELECT Valid_from, Exchange_Rate, Exchange_Rate_Type, From_currency, To_currency, 
        coalesce(LEAD(Valid_from) OVER ( ORDER BY Valid_from ASC), cast('3001-12-31' as DATE)) valid_to
     FROM exchange_table where To_currency='EUR' and Exchange_Rate_Type = 'EURX') rates
on transactions.view_currency = rates.From_currency
and transactions.date_trx >= rates.Valid_from 
and transactions.date_trx < rates.valid_to

我手动创建了valid_to,只是将一个时期的valid_from值放入前一个时期的valid_to。当汇率仍然有效时,我输入了 3001-12-31。

这个查询的问题是它为所有费率字段返回 NULL 值。我检查了两个单独的表,它们都很好。有趣的是,如果我只过滤一种货币的汇率表,它可以正常工作(使用该货币进行的交易没有 NULL 值),否则不会。如果我尝试过滤两种或多种货币,它也会为所有交易返回 NULL 值。

【问题讨论】:

    标签: sql join google-bigquery


    【解决方案1】:

    您需要lead()中的货币:

    select * 
    from(SELECT date_trx, view_currency
         FROM transactions_table
        ) transactions left join
        (SELECT Valid_from, Exchange_Rate, Exchange_Rate_Type, From_currency, To_currency, 
               LEAD(Valid_from, 1, date('3001-12-31')) OVER (partition by currency ORDER BY Valid_from ASC), cast('3001-12-31' as DATE) as valid_to
         FROM exchange_table 
        ) rates
        on transactions.view_currency = rates.From_currency and
           transactions.date_trx >= rates.Valid_from and
           transactions.date_trx < rates.valid_to;
    

    请注意,我还使用 lead() 的三参数形式简化了 valid_to 逻辑。

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 2022-06-23
      • 2012-06-10
      相关资源
      最近更新 更多