- Replace $0 electricity prices with real EIA retail-sales data (IND sector) with demand-based hourly variation (0.8x-1.2x) - Add sparkline component and alerts feed to dashboard home - Add animated number transitions to hero metric cards - Fix ticker tape price direction (green/red arrows with % change) - Fix AI milestone annotation alignment on price charts - Fix SQL cartesian products in getDemandByRegion and getRegionPriceHeatmap using CTEs for independent aggregation - Add unique composite constraints to prevent duplicate data - Add bearer token auth to ingestion API routes - Add 30s fetch timeouts to EIA and FRED API clients - Add regionCode validation in server actions - Fix docker-compose: localhost-only port binding, correct volume path - Fix seed script to preserve ingested time-series data
31 lines
808 B
SQL
31 lines
808 B
SQL
WITH price_agg AS (
|
|
SELECT
|
|
ep.region_id,
|
|
AVG(ep.price_mwh) AS avg_price,
|
|
MAX(ep.price_mwh) AS max_price,
|
|
AVG(ep.demand_mw) AS avg_demand
|
|
FROM electricity_prices ep
|
|
WHERE ep.timestamp > NOW() - INTERVAL '24 hours'
|
|
GROUP BY ep.region_id
|
|
),
|
|
dc_agg AS (
|
|
SELECT
|
|
d.region_id,
|
|
COUNT(*)::INT AS datacenter_count,
|
|
COALESCE(SUM(d.capacity_mw), 0) AS total_dc_capacity_mw
|
|
FROM datacenters d
|
|
GROUP BY d.region_id
|
|
)
|
|
SELECT
|
|
r.code,
|
|
r.name,
|
|
ST_AsGeoJSON(r.boundary)::TEXT AS boundary_geojson,
|
|
pa.avg_price,
|
|
pa.max_price,
|
|
pa.avg_demand,
|
|
COALESCE(dc.datacenter_count, 0)::INT AS datacenter_count,
|
|
COALESCE(dc.total_dc_capacity_mw, 0) AS total_dc_capacity_mw
|
|
FROM grid_regions r
|
|
LEFT JOIN price_agg pa ON pa.region_id = r.id
|
|
LEFT JOIN dc_agg dc ON dc.region_id = r.id
|