diff --git a/libs/common/src/sql/procedures/fact_daily_energy_consumed/fact_daily_energy_consumed_procedure.sql b/libs/common/src/sql/procedures/fact_daily_energy_consumed/fact_daily_energy_consumed_procedure.sql new file mode 100644 index 0000000..82725d0 --- /dev/null +++ b/libs/common/src/sql/procedures/fact_daily_energy_consumed/fact_daily_energy_consumed_procedure.sql @@ -0,0 +1,111 @@ +WITH params AS ( + SELECT + 'd72f3d5d-02e5-4a9e-a1f7-7ab8c3534910'::uuid AS device_id, + '2025-04-23'::date AS target_date +), +total_energy AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumed' + AND log.device_id = params.device_id + AND log.event_time::date = params.target_date + GROUP BY 1,2,3,4,5 +), +energy_phase_A AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumedA' + AND log.device_id = params.device_id + AND log.event_time::date = params.target_date + GROUP BY 1,2,3,4,5 +), +energy_phase_B AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumedB' + AND log.device_id = params.device_id + AND log.event_time::date = params.target_date + GROUP BY 1,2,3,4,5 +), +energy_phase_C AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumedC' + AND log.device_id = params.device_id + AND log.event_time::date = params.target_date + GROUP BY 1,2,3,4,5 +), +final_data AS ( + SELECT + t.device_id, + t.date, + t.event_year::text, + t.event_month, + t.hour, + (t.max_value - t.min_value) AS energy_consumed_kW, + (a.max_value - a.min_value) AS energy_consumed_A, + (b.max_value - b.min_value) AS energy_consumed_B, + (c.max_value - c.min_value) AS energy_consumed_C + FROM total_energy t + JOIN energy_phase_A a ON t.device_id = a.device_id AND t.date = a.date AND t.hour = a.hour + JOIN energy_phase_B b ON t.device_id = b.device_id AND t.date = b.date AND t.hour = b.hour + JOIN energy_phase_C c ON t.device_id = c.device_id AND t.date = c.date AND t.hour = c.hour +) + +-- Final upsert into daily table +INSERT INTO public."power-clamp-energy-consumed-daily" ( + device_uuid, + energy_consumed_kw, + energy_consumed_a, + energy_consumed_b, + energy_consumed_c, + date +) +SELECT + device_id, + SUM(CAST(energy_consumed_kW AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_A AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_B AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_C AS NUMERIC))::VARCHAR, + date +FROM final_data +GROUP BY device_id, date +ON CONFLICT (device_uuid, date) DO UPDATE +SET + energy_consumed_kw = EXCLUDED.energy_consumed_kw, + energy_consumed_a = EXCLUDED.energy_consumed_a, + energy_consumed_b = EXCLUDED.energy_consumed_b, + energy_consumed_c = EXCLUDED.energy_consumed_c; + + + + + diff --git a/libs/common/src/sql/procedures/fact_daily_energy_consumed/fact_hourly_energy_consumed_procedure.sql b/libs/common/src/sql/procedures/fact_daily_energy_consumed/fact_hourly_energy_consumed_procedure.sql new file mode 100644 index 0000000..ff17747 --- /dev/null +++ b/libs/common/src/sql/procedures/fact_daily_energy_consumed/fact_hourly_energy_consumed_procedure.sql @@ -0,0 +1,113 @@ +WITH params AS ( + SELECT + 'd72f3d5d-02e5-4a9e-a1f7-7ab8c3534910'::uuid AS device_id, + '2025-04-23'::date AS target_date, + '14'::text AS target_hour +), +total_energy AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time)::text AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumed' + AND log.device_id = params.device_id + AND log.event_time::date = params.target_date + AND EXTRACT(HOUR FROM log.event_time)::text = params.target_hour + GROUP BY 1,2,3,4,5 +), +energy_phase_A AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time)::text AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumedA' + AND log.device_id = params.device_id + AND log.event_time::date = params.target_date + AND EXTRACT(HOUR FROM log.event_time)::text = params.target_hour + GROUP BY 1,2,3,4,5 +), +energy_phase_B AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time)::text AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumedB' + AND log.device_id = params.device_id + AND log.event_time::date = params.target_date + AND EXTRACT(HOUR FROM log.event_time)::text = params.target_hour + GROUP BY 1,2,3,4,5 +), +energy_phase_C AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time)::text AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumedC' + AND log.device_id = params.device_id + AND log.event_time::date = params.target_date + AND EXTRACT(HOUR FROM log.event_time)::text = params.target_hour + GROUP BY 1,2,3,4,5 +), +final_data AS ( + SELECT + t.device_id, + t.date, + t.event_year::text, + t.event_month, + t.hour, + (t.max_value - t.min_value) AS energy_consumed_kW, + (a.max_value - a.min_value) AS energy_consumed_A, + (b.max_value - b.min_value) AS energy_consumed_B, + (c.max_value - c.min_value) AS energy_consumed_C + FROM total_energy t + JOIN energy_phase_A a ON t.device_id = a.device_id AND t.date = a.date AND t.hour = a.hour + JOIN energy_phase_B b ON t.device_id = b.device_id AND t.date = b.date AND t.hour = b.hour + JOIN energy_phase_C c ON t.device_id = c.device_id AND t.date = c.date AND t.hour = c.hour +) + +-- UPSERT into hourly table +INSERT INTO public."power-clamp-energy-consumed-hourly" ( + device_uuid, + energy_consumed_kw, + energy_consumed_a, + energy_consumed_b, + energy_consumed_c, + date, + hour +) +SELECT + device_id, + SUM(CAST(energy_consumed_kW AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_A AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_B AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_C AS NUMERIC))::VARCHAR, + date, + hour +FROM final_data +GROUP BY 1,6,7 +ON CONFLICT (device_uuid, date, hour) DO UPDATE +SET + energy_consumed_kw = EXCLUDED.energy_consumed_kw, + energy_consumed_a = EXCLUDED.energy_consumed_a, + energy_consumed_b = EXCLUDED.energy_consumed_b, + energy_consumed_c = EXCLUDED.energy_consumed_c; \ No newline at end of file diff --git a/libs/common/src/sql/procedures/fact_daily_energy_consumed/fact_monthly_energy_consumed_procedure.sql b/libs/common/src/sql/procedures/fact_daily_energy_consumed/fact_monthly_energy_consumed_procedure.sql new file mode 100644 index 0000000..cdf6134 --- /dev/null +++ b/libs/common/src/sql/procedures/fact_daily_energy_consumed/fact_monthly_energy_consumed_procedure.sql @@ -0,0 +1,107 @@ +WITH params AS ( + SELECT + 'd72f3d5d-02e5-4a9e-a1f7-7ab8c3534910'::uuid AS device_id, + '03-2025'::text AS target_month -- Format should match 'MM-YYYY' +), +total_energy AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumed' + AND log.device_id = params.device_id + AND TO_CHAR(log.event_time, 'MM-YYYY') = params.target_month + GROUP BY 1,2,3,4,5 +), +energy_phase_A AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumedA' + AND log.device_id = params.device_id + AND TO_CHAR(log.event_time, 'MM-YYYY') = params.target_month + GROUP BY 1,2,3,4,5 +), +energy_phase_B AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumedB' + AND log.device_id = params.device_id + AND TO_CHAR(log.event_time, 'MM-YYYY') = params.target_month + GROUP BY 1,2,3,4,5 +), +energy_phase_C AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log, params + WHERE log.code = 'EnergyConsumedC' + AND log.device_id = params.device_id + AND TO_CHAR(log.event_time, 'MM-YYYY') = params.target_month + GROUP BY 1,2,3,4,5 +), +final_data AS ( + SELECT + t.device_id, + t.date, + t.event_year::text, + t.event_month, + t.hour, + (t.max_value - t.min_value) AS energy_consumed_kW, + (a.max_value - a.min_value) AS energy_consumed_A, + (b.max_value - b.min_value) AS energy_consumed_B, + (c.max_value - c.min_value) AS energy_consumed_C + FROM total_energy t + JOIN energy_phase_A a ON t.device_id = a.device_id AND t.date = a.date AND t.hour = a.hour + JOIN energy_phase_B b ON t.device_id = b.device_id AND t.date = b.date AND t.hour = b.hour + JOIN energy_phase_C c ON t.device_id = c.device_id AND t.date = c.date AND t.hour = c.hour +) + +-- Final monthly UPSERT +INSERT INTO public."power-clamp-energy-consumed-monthly" ( + device_uuid, + energy_consumed_kw, + energy_consumed_a, + energy_consumed_b, + energy_consumed_c, + month +) +SELECT + device_id, + SUM(CAST(energy_consumed_kW AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_A AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_B AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_C AS NUMERIC))::VARCHAR, + event_month +FROM final_data +GROUP BY device_id, event_month +ON CONFLICT (device_uuid, month) DO UPDATE +SET + energy_consumed_kw = EXCLUDED.energy_consumed_kw, + energy_consumed_a = EXCLUDED.energy_consumed_a, + energy_consumed_b = EXCLUDED.energy_consumed_b, + energy_consumed_c = EXCLUDED.energy_consumed_c; +