forgashBTC Network Stats Claude v3
    Updated 2024-08-27
    -- First, let's create a CTE to identify the first appearance of each address
    WITH first_appearance AS (
    SELECT
    PUBKEY_SCRIPT_ADDRESS,
    DATE_TRUNC('week', MIN(BLOCK_TIMESTAMP)) AS first_week
    FROM BITCOIN.CORE.FACT_OUTPUTS
    WHERE PUBKEY_SCRIPT_ADDRESS IS NOT NULL
    GROUP BY PUBKEY_SCRIPT_ADDRESS
    ),

    -- Now, let's create our weekly metrics CTE
    weekly_metrics AS (
    SELECT
    DATE_TRUNC('week', b.BLOCK_TIMESTAMP) AS week,
    COUNT(DISTINCT b.BLOCK_NUMBER) AS blocks_per_week,
    COUNT(DISTINCT t.TX_ID) AS transactions_per_week,
    COUNT(DISTINCT o.PUBKEY_SCRIPT_ADDRESS) AS active_addresses,
    COUNT(DISTINCT CASE
    WHEN fa.first_week = DATE_TRUNC('week', b.BLOCK_TIMESTAMP) THEN o.PUBKEY_SCRIPT_ADDRESS
    END) AS new_addresses
    FROM
    BITCOIN.CORE.FACT_BLOCKS b
    LEFT JOIN BITCOIN.CORE.FACT_TRANSACTIONS t ON b.BLOCK_NUMBER = t.BLOCK_NUMBER
    LEFT JOIN BITCOIN.CORE.FACT_OUTPUTS o ON t.TX_ID = o.TX_ID
    LEFT JOIN first_appearance fa ON o.PUBKEY_SCRIPT_ADDRESS = fa.PUBKEY_SCRIPT_ADDRESS
    GROUP BY
    DATE_TRUNC('week', b.BLOCK_TIMESTAMP)
    )

    -- Main query with 4-week moving averages
    SELECT
    week,
    AVG(blocks_per_week) OVER (ORDER BY week ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS blocks_per_week_4w_avg,
    AVG(transactions_per_week) OVER (ORDER BY week ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS transactions_per_week_4w_avg,
    AVG(active_addresses) OVER (ORDER BY week ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS active_addresses_4w_avg,
    AVG(new_addresses) OVER (ORDER BY week ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS new_addresses_4w_avg
    QueryRunArchived: QueryRun has been archived