-- 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;