Created currency exchange tables
This commit is contained in:
parent
4958976733
commit
f64b17a223
3 changed files with 153 additions and 0 deletions
11
models/reporting/general/daily_currency_exchange_rates.sql
Normal file
11
models/reporting/general/daily_currency_exchange_rates.sql
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
with daily_currency as (select * from {{ ref("int_daily_currency_exchange_rates") }})
|
||||
select
|
||||
id_exchange_rate as id_exchange_rate,
|
||||
from_currency as from_currency,
|
||||
to_currency as to_currency,
|
||||
rate as rate,
|
||||
rate_date_utc as rate_date_utc,
|
||||
source as source,
|
||||
rate_version as rate_version,
|
||||
updated_at_utc as updated_at_utc
|
||||
from daily_currency
|
||||
|
|
@ -164,3 +164,137 @@ models:
|
|||
- name: year_end_date
|
||||
data_type: date
|
||||
description: The full date for the last day of the year.
|
||||
|
||||
- name: daily_currency_exchange_rates
|
||||
description:
|
||||
This model holds a lot of data on currency exchange rates. The time
|
||||
granularity is daily. Each record holds a currency pair for a specific
|
||||
day, source and version.
|
||||
|
||||
Actual rates are sourced from xe.com data. The `guessed` and `forecast`
|
||||
versions are built by simply 'pushing' the first/last exchange rate on
|
||||
record. Basically, wherever we don't have data for a date, we pick the
|
||||
closest actual data point that comes from xe.com. Bear in mind this means
|
||||
that `forecast` version records will change on a daily basis as actual
|
||||
data moves forwards, meaning you shouldn't assume your money amounts
|
||||
converted in the future should always stay put.
|
||||
|
||||
Note that, given the dimensionality, getting a simple time series for a
|
||||
currency pair will require a bit of filtering.
|
||||
|
||||
Reverse rates are explicit. This means that, for any given day and any
|
||||
given currency pair, you will find two records with opposite from/to
|
||||
positions. So, for 2024-01-01, you will find both a EUR->USD record and a
|
||||
USD->EUR record with the opposite rate (1/rate).
|
||||
columns:
|
||||
- name: id_exchange_rate
|
||||
data_type: text
|
||||
description: A unique ID for the record, derived from concatenating the
|
||||
currencies, date, source and version. Currency order is relevant
|
||||
(EURUSD != USDEUR).
|
||||
tests:
|
||||
- not_null
|
||||
- unique
|
||||
- name: from_currency
|
||||
data_type: character
|
||||
description: The source currency, represented as an ISO 4217 code.
|
||||
tests:
|
||||
- not_null
|
||||
- name: to_currency
|
||||
data_type: character
|
||||
description: The target currency, represented as an ISO 4217 code.
|
||||
tests:
|
||||
- not_null
|
||||
- name: rate
|
||||
data_type: numeric
|
||||
description: >-
|
||||
The exchange rate, represented as the units of the target currency
|
||||
that one unit of source currency gets you. So, from_currency=USD to
|
||||
to_currency=PLN with rate=4.2 should be read as '1 US Dollar buys me
|
||||
4.2 Polish Zlotys'.
|
||||
|
||||
For same currency pairs (EUR to EUR, USD to USD, etc). The rate will
|
||||
always be one.
|
||||
|
||||
The rate can be smaller than one, but can't be negative.
|
||||
tests:
|
||||
- not_negative_or_zero
|
||||
- not_null
|
||||
- name: rate_date_utc
|
||||
data_type: date
|
||||
description: The date in which the rate record is relevant.
|
||||
tests:
|
||||
- not_null
|
||||
- name: source
|
||||
data_type: text
|
||||
description:
|
||||
Where is the data coming from. Records that are composed from
|
||||
making assumptions on real data will contain `_inferred`.
|
||||
- name: rate_version
|
||||
data_type: text
|
||||
description:
|
||||
The version of the rate. This can be one of `actual` (the rate is a
|
||||
reality fact), `forecast` (the rate sits in the future and is a guess
|
||||
in nature) or `guess` (the rate sits in the past and is a guess in
|
||||
nature). Note that one currency pair can have multiple rate versions
|
||||
on the same date.
|
||||
tests:
|
||||
- accepted_values:
|
||||
values:
|
||||
- guess
|
||||
- actual
|
||||
- forecast
|
||||
- not_null
|
||||
- name: updated_at_utc
|
||||
data_type: timestamp with time zone
|
||||
description:
|
||||
For external sources, this will be the point in time when the
|
||||
information was obtained from them. For stuff we make up here in the
|
||||
DWH, this will be the point in time when we made the assumption.
|
||||
tests:
|
||||
- not_null
|
||||
|
||||
- name: simple_exchange_rates
|
||||
description: >-
|
||||
A simplified vision of exchange rates, derived from
|
||||
`int_daily_currency_exchange_rates`. Come here if you don't want to
|
||||
understand nuances and complexities and just want to convert rates.
|
||||
|
||||
The time granularity is daily. Each record holds a currency pair for a
|
||||
specific day. You will only find one conversion rate per currency pair and
|
||||
date.
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- from_currency
|
||||
- to_currency
|
||||
- rate_date_utc
|
||||
columns:
|
||||
- name: from_currency
|
||||
data_type: character
|
||||
description: The source currency, represented as an ISO 4217 code.
|
||||
tests:
|
||||
- not_null
|
||||
- name: to_currency
|
||||
data_type: character
|
||||
description: The source currency, represented as an ISO 4217 code.
|
||||
tests:
|
||||
- not_null
|
||||
- name: rate
|
||||
data_type: numeric
|
||||
description: The target currency, represented as an ISO 4217 code.
|
||||
tests:
|
||||
- not_null
|
||||
- name: rate_date_utc
|
||||
data_type: date
|
||||
description: The date in which the rate record is relevant.
|
||||
tests:
|
||||
- not_null
|
||||
- name: updated_at_utc
|
||||
data_type: timestamp with time zone
|
||||
description:
|
||||
For external sources, this will be the point in time when the
|
||||
information was obtained from them. For stuff we make up here in the
|
||||
DWH, this will be the point in time when we made the assumption.
|
||||
tests:
|
||||
- not_null
|
||||
8
models/reporting/general/simple_exchange_rates.sql
Normal file
8
models/reporting/general/simple_exchange_rates.sql
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
with simple_exchange_rates as (select * from {{ ref("int_simple_exchange_rates") }})
|
||||
select
|
||||
from_currency as from_currency,
|
||||
to_currency as to_currency,
|
||||
rate as rate,
|
||||
rate_date_utc as rate_date_utc,
|
||||
updated_at_utc as updated_at_utc
|
||||
from simple_exchange_rates
|
||||
Loading…
Add table
Add a link
Reference in a new issue