Files
ems/db/views/R__vw_audit_summary.sql
Dusan Vojacek 8b4af663d8 Initial commit
Made-with: Cursor
2026-03-20 13:27:44 +01:00

70 lines
3.5 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================
-- R__vw_audit_summary.sql
-- EMS Platform přehledové views pro audit a dashboard
-- Repeatable migration
-- =============================================================
-- Denní souhrn per lokalita
CREATE OR REPLACE VIEW ems.vw_audit_daily AS
SELECT
site_id,
date_trunc('day', interval_start AT TIME ZONE 'Europe/Prague') AS day_local,
COUNT(*) AS interval_count,
-- Energie (kWh = W × 15min / 60 = W / 4 / 1000)
ROUND(SUM(GREATEST(actual_grid_power_w, 0))::NUMERIC / 4000, 3) AS import_kwh,
ROUND(SUM(ABS(LEAST(actual_grid_power_w, 0)))::NUMERIC / 4000, 3) AS export_kwh,
ROUND(SUM(GREATEST(actual_pv_power_w, 0))::NUMERIC / 4000, 3) AS pv_kwh,
ROUND(SUM(GREATEST(actual_load_power_w, 0))::NUMERIC / 4000, 3) AS load_kwh,
ROUND(SUM(GREATEST(actual_ev_power_w, 0))::NUMERIC / 4000, 3) AS ev_kwh,
ROUND(SUM(GREATEST(actual_heat_pump_power_w, 0))::NUMERIC / 4000, 3) AS hp_kwh,
-- Náklady
ROUND(SUM(actual_cost_czk), 2) AS actual_cost_czk,
ROUND(SUM(deviation_cost_czk), 2) AS total_deviation_czk,
-- Počet intervalů s velkými odchylkami (>1kW)
COUNT(*) FILTER (WHERE ABS(deviation_grid_w) > 1000) AS high_deviation_count
FROM ems.audit_interval
GROUP BY site_id, date_trunc('day', interval_start AT TIME ZONE 'Europe/Prague');
COMMENT ON VIEW ems.vw_audit_daily IS
'Denní souhrn auditu per lokalita. Energie v kWh, náklady v Kč.
Používat pro dashboard denního přehledu a reporty.';
-- ============================================================
-- Týdenní souhrn
CREATE OR REPLACE VIEW ems.vw_audit_weekly AS
SELECT
site_id,
date_trunc('week', interval_start AT TIME ZONE 'Europe/Prague') AS week_local,
ROUND(SUM(GREATEST(actual_grid_power_w, 0))::NUMERIC / 4000, 1) AS import_kwh,
ROUND(SUM(ABS(LEAST(actual_grid_power_w, 0)))::NUMERIC / 4000, 1) AS export_kwh,
ROUND(SUM(GREATEST(actual_pv_power_w, 0))::NUMERIC / 4000, 1) AS pv_kwh,
ROUND(SUM(actual_cost_czk), 0) AS actual_cost_czk
FROM ems.audit_interval
GROUP BY site_id, date_trunc('week', interval_start AT TIME ZONE 'Europe/Prague');
COMMENT ON VIEW ems.vw_audit_weekly IS
'Týdenní souhrn auditu per lokalita.';
-- ============================================================
-- Aktuální den hourly breakdown pro dashboard graf
CREATE OR REPLACE VIEW ems.vw_audit_today_hourly AS
SELECT
site_id,
date_trunc('hour', interval_start AT TIME ZONE 'Europe/Prague') AS hour_local,
ROUND(AVG(actual_pv_power_w)::NUMERIC / 1000, 2) AS avg_pv_kw,
ROUND(AVG(actual_battery_power_w)::NUMERIC / 1000, 2) AS avg_battery_kw,
ROUND(AVG(actual_grid_power_w)::NUMERIC / 1000, 2) AS avg_grid_kw,
ROUND(AVG(actual_load_power_w)::NUMERIC / 1000, 2) AS avg_load_kw,
ROUND(AVG(actual_battery_soc_pct), 1) AS avg_soc_pct,
ROUND(SUM(actual_cost_czk), 2) AS cost_czk
FROM ems.audit_interval
WHERE interval_start >= date_trunc('day', now() AT TIME ZONE 'Europe/Prague')
AND interval_start < date_trunc('day', now() AT TIME ZONE 'Europe/Prague') + INTERVAL '1 day'
GROUP BY site_id, date_trunc('hour', interval_start AT TIME ZONE 'Europe/Prague')
ORDER BY hour_local;
COMMENT ON VIEW ems.vw_audit_today_hourly IS
'Hodinový přehled dnešního dne pro dashboard graf výkonů a nákladů.';