ceo-api/trade-intelligence/schema.sql

93 lines
3.1 KiB
SQL

-- Trade Intelligence — External API Data Store
-- Sources: UN Comtrade, IMF, World Bank, Eurostat
CREATE DATABASE IF NOT EXISTS trade_intelligence;
-- UN Comtrade: bilateral trade flows
CREATE TABLE IF NOT EXISTS trade_intelligence.comtrade
(
id UUID DEFAULT generateUUIDv4(),
period UInt32, -- YYYYMM or YYYY
period_type LowCardinality(String), -- M=monthly, A=annual
reporter_code UInt16,
reporter String,
partner_code UInt16,
partner String,
trade_flow LowCardinality(String), -- Import | Export | Re-Import | Re-Export
commodity_code String,
commodity String,
netweight_kg Float64,
trade_value_usd Float64,
qty Float64,
qty_unit LowCardinality(String),
fetched_at DateTime DEFAULT now()
)
ENGINE = ReplacingMergeTree(fetched_at)
ORDER BY (period, reporter_code, partner_code, trade_flow, commodity_code)
PARTITION BY toString(intDiv(period, 100));
-- IMF World Economic Outlook
CREATE TABLE IF NOT EXISTS trade_intelligence.imf_weo
(
country_code LowCardinality(String),
country String,
indicator_code LowCardinality(String),
indicator String,
year UInt16,
value Nullable(Float64),
unit LowCardinality(String),
scale LowCardinality(String),
fetched_at DateTime DEFAULT now()
)
ENGINE = ReplacingMergeTree(fetched_at)
ORDER BY (country_code, indicator_code, year);
-- World Bank Open Data
CREATE TABLE IF NOT EXISTS trade_intelligence.worldbank
(
country_code LowCardinality(String),
country String,
indicator_code LowCardinality(String),
indicator String,
year UInt16,
value Nullable(Float64),
fetched_at DateTime DEFAULT now()
)
ENGINE = ReplacingMergeTree(fetched_at)
ORDER BY (country_code, indicator_code, year);
-- Eurostat: Comext trade data (intra+extra EU)
CREATE TABLE IF NOT EXISTS trade_intelligence.eurostat_comext
(
period UInt32,
reporter LowCardinality(String),
partner LowCardinality(String),
product String, -- CN8 code
flow LowCardinality(String), -- 1=Import 2=Export
value_eur Float64,
quantity_ton Float64,
stat_value Float64,
fetched_at DateTime DEFAULT now()
)
ENGINE = ReplacingMergeTree(fetched_at)
ORDER BY (period, reporter, partner, product, flow)
PARTITION BY toString(intDiv(period, 100));
-- Predictions: AI-generated trade forecasts stored here
CREATE TABLE IF NOT EXISTS trade_intelligence.predictions
(
id UUID DEFAULT generateUUIDv4(),
created_at DateTime DEFAULT now(),
commodity_code String,
commodity String,
reporter String,
partner String,
horizon_months UInt8,
predicted_value_usd Float64,
confidence Float32,
model LowCardinality(String),
features String, -- JSON
rationale String
)
ENGINE = MergeTree()
ORDER BY (created_at, commodity_code, reporter);