-- Daily swap volume by DEX platform
SELECT
DATE_TRUNC('day', block_timestamp) AS date,
platform,
COUNT(*) AS swap_count,
COUNT(DISTINCT sender) AS unique_traders,
COUNT(DISTINCT pool_address) AS active_pools,
SUM(amount_in_usd) AS total_volume_usd,
AVG(amount_in_usd) AS avg_swap_size_usd,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount_in_usd) AS median_swap_usd
FROM <blockchain_name>.defi.ez_dex_swaps
WHERE block_timestamp >= CURRENT_DATE - 30
AND amount_in_usd IS NOT NULL
AND amount_in_usd > 0
GROUP BY 1, 2
ORDER BY 1 DESC, 6 DESC;
-- Most active trading pairs
WITH pair_volume AS (
SELECT
LEAST(token_in, token_out) AS token_a,
GREATEST(token_in, token_out) AS token_b,
LEAST(symbol_in, symbol_out) AS symbol_a,
GREATEST(symbol_in, symbol_out) AS symbol_b,
COUNT(*) AS swap_count,
SUM(amount_in_usd) AS volume_usd,
COUNT(DISTINCT sender) AS unique_traders,
COUNT(DISTINCT DATE(block_timestamp)) AS active_days
FROM <blockchain_name>.defi.ez_dex_swaps
WHERE block_timestamp >= CURRENT_DATE - 7
AND amount_in_usd IS NOT NULL
GROUP BY 1, 2, 3, 4
)
SELECT
symbol_a || '/' || symbol_b AS pair,
swap_count,
volume_usd,
unique_traders,
active_days,
volume_usd / swap_count AS avg_swap_size
FROM pair_volume
WHERE volume_usd > 100000
ORDER BY volume_usd DESC
LIMIT 50;
-- Price discrepancies across DEXs for same token pairs
WITH recent_swaps AS (
SELECT
block_timestamp,
platform,
token_in,
token_out,
symbol_in,
symbol_out,
amount_in,
amount_out,
amount_in_usd / NULLIF(amount_in, 0) AS price_in_usd,
amount_out_usd / NULLIF(amount_out, 0) AS price_out_usd,
-- Calculate implied exchange rate
amount_out / NULLIF(amount_in, 0) AS exchange_rate
FROM <blockchain_name>.defi.ez_dex_swaps
WHERE block_timestamp >= CURRENT_TIMESTAMP - INTERVAL '1 hour'
AND amount_in > 0
AND amount_out > 0
AND amount_in_usd IS NOT NULL
),
price_comparison AS (
SELECT
DATE_TRUNC('minute', block_timestamp) AS minute,
token_in,
token_out,
symbol_in || '->' || symbol_out AS pair,
platform,
AVG(exchange_rate) AS avg_rate,
COUNT(*) AS swap_count
FROM recent_swaps
GROUP BY 1, 2, 3, 4, 5
)
SELECT
p1.minute,
p1.pair,
p1.platform AS platform_1,
p2.platform AS platform_2,
p1.avg_rate AS rate_1,
p2.avg_rate AS rate_2,
ABS(p1.avg_rate - p2.avg_rate) / LEAST(p1.avg_rate, p2.avg_rate) * 100 AS price_diff_pct
FROM price_comparison p1
JOIN price_comparison p2
ON p1.minute = p2.minute
AND p1.token_in = p2.token_in
AND p1.token_out = p2.token_out
AND p1.platform < p2.platform
WHERE price_diff_pct > 1 -- More than 1% difference
ORDER BY p1.minute DESC, price_diff_pct DESC;
-- Large swaps by size and impact
SELECT
block_timestamp,
tx_hash,
platform,
sender,
symbol_in || ' -> ' || symbol_out AS swap_pair,
amount_in,
amount_in_usd,
amount_out,
amount_out_usd,
ABS(amount_in_usd - amount_out_usd) / NULLIF(amount_in_usd, 0) * 100 AS slippage_pct
FROM <blockchain_name>.defi.ez_dex_swaps
WHERE block_timestamp >= CURRENT_DATE - 1
AND amount_in_usd > 100000 -- Swaps over $100k
ORDER BY amount_in_usd DESC
LIMIT 100;
-- Platform market share by volume
WITH platform_stats AS (
SELECT
platform,
SUM(amount_in_usd) AS total_volume,
COUNT(*) AS total_swaps,
COUNT(DISTINCT sender) AS unique_users,
COUNT(DISTINCT pool_address) AS unique_pools
FROM <blockchain_name>.defi.ez_dex_swaps
WHERE block_timestamp >= CURRENT_DATE - 7
AND amount_in_usd IS NOT NULL
GROUP BY 1
)
SELECT
platform,
total_volume,
ROUND(100.0 * total_volume / SUM(total_volume) OVER (), 2) AS market_share_pct,
total_swaps,
unique_users,
unique_pools,
total_volume / NULLIF(total_swaps, 0) AS avg_swap_size
FROM platform_stats
ORDER BY total_volume DESC;