Skip to content

Tutorial: Getting Started with 15-Minute Power Volumes

This tutorial walks you through running your first 15m power volume query, reading the output, and adding filters. Plan for about 15 minutes.

You'll use the generic fct_volume_pwr_15m view — the migration target for new work.

What you need

  • Snowflake access to NUMERA_EWE_PROD_CORE.NUMERA_DIM_MODEL
  • A reporting role (e.g. NUMERA_EWE_PROD_REPORTER)
  • A warehouse (NUMERA_PROD_REPORTING is fine)
  • The time_series.15m feature flag must be enabled on your stack (see Feature flag)

If you don't have access yet, see Connecting to Data.


Step 1 — One day, one business case

Pick a recent date and a business case you know is active. Run:

select
    delivery_date_utc,
    begin_utc,
    begin_cet,
    business_case,
    grid,
    volume_buy_mw,
    volume_sell_mw,
    buy_vwap_price_eur_per_mwh,
    sell_vwap_price_eur_per_mwh
from fct_volume_pwr_15m
where delivery_date_utc = '2026-04-15'
  and business_case = 'Intraday'
order by begin_utc, grid
limit 200

You should get back rows with 15-minute UTC start timestamps (00:00, 00:15, …, 23:45), one per (grid, business_case, dim_deal_attribute_id) combination per period.

Step 2 — Read the output

A few things to notice:

  • 96 rows per day per combo. Some rows have volume_buy_mw = 0 and volume_sell_mw = 0. Those are gap rows — every period gets a row even when no trade contributed. See Gap-filling.
  • begin_utc vs begin_cet. Same instant, different time zones. UTC is always 96 periods per day; CET may have 92 or 100 distinct labels on DST days. See Time zones and DST.
  • The grain is wider than you might expect. The view is at deal-attribute grain — multiple rows can have the same (begin_utc, business_case, grid) if different dim_deal_attribute_ids contributed. To collapse to business-case grain, aggregate:
select
    delivery_date_utc,
    begin_utc,
    business_case,
    grid,
    sum(volume_buy_mw)  as volume_buy_mw,
    sum(volume_sell_mw) as volume_sell_mw
from fct_volume_pwr_15m
where delivery_date_utc = '2026-04-15'
  and business_case = 'Intraday'
group by 1, 2, 3, 4
order by 2, 4

Step 3 — Add a portfolio filter

Join dim_deal_attribute to filter by portfolio:

select
    f.delivery_date_utc,
    f.begin_utc,
    f.business_case,
    f.grid,
    sum(f.volume_buy_mw)  as volume_buy_mw,
    sum(f.volume_sell_mw) as volume_sell_mw
from fct_volume_pwr_15m f
join dim_deal_attribute da
    on f.dim_deal_attribute_id = da.dim_deal_attribute_id
where da.portfolio = 'PWR_ST_PF_Netting'
  and f.delivery_date_utc = '2026-04-15'
group by 1, 2, 3, 4
order by 2, 4

The dim_deal_attribute_id surrogate-key column on fct_volume_pwr_15m is the join point to any deal-level filter — portfolio, instrument, buy/sell, commodity. See Join dimensional views.

Step 4 — Drill down to deals

When you need per-deal detail, switch to the deal-grain variant:

select
    f.delivery_date_utc,
    f.deal_id,
    f.business_case,
    f.grid,
    da.portfolio,
    sum(f.volume_buy_mw)  as volume_buy_mw,
    sum(f.volume_sell_mw) as volume_sell_mw,
    avg(f.buy_vwap_price_eur_per_mwh) as avg_buy_vwap
from fct_volume_pwr_15m_deal f
join dim_deal_attribute da
    on f.dim_deal_attribute_id = da.dim_deal_attribute_id
where da.portfolio = 'PWR_ST_PF_Netting'
  and f.delivery_date_utc = '2026-04-15'
group by 1, 2, 3, 4, 5
order by sum(f.volume_buy_mw) + sum(f.volume_sell_mw) desc
limit 20

Step 5 — Always bound by date

Every query so far has had a WHERE delivery_date_utc = ... clause. That's not stylistic — without it, the view scans the full dim_period range (2020 onward) and the cross-join with active combos explodes. Slow.

If you find yourself omitting the date filter, you'll either time out or end up paying for compute you didn't intend. See Filter and aggregate efficiently.

What's next

You've used the generic numera-core 15m view. EWE also has wrapper views (fct_ewe_volume_pwr_*) with EWE-specific filters pre-applied. The data is the same, just pre-filtered.