From 30dd8318e35ace77255390e9e1051a0f8002530a Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Tue, 15 Apr 2025 12:20:37 +0300 Subject: [PATCH] Add SQL queries for hourly energy consumption tracking and refactor daily energy consumed query --- .../fact_daily_energy_consumed.sql | 5 +- .../fact_hourly_active_energy.sql | 65 +++++++++++++++++ .../fact_hourly_energy_consumed.sql | 71 +++++++++++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 libs/common/src/sql/queries/fact_hourly_active_energy/fact_hourly_active_energy.sql create mode 100644 libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql diff --git a/libs/common/src/sql/queries/fact_daily_energy_consumed/fact_daily_energy_consumed.sql b/libs/common/src/sql/queries/fact_daily_energy_consumed/fact_daily_energy_consumed.sql index 00b0ca0..b7967ce 100644 --- a/libs/common/src/sql/queries/fact_daily_energy_consumed/fact_daily_energy_consumed.sql +++ b/libs/common/src/sql/queries/fact_daily_energy_consumed/fact_daily_energy_consumed.sql @@ -61,5 +61,8 @@ JOIN energy_phase_B and total_energy.date=energy_phase_B.date JOIN energy_phase_C ON total_energy.device_id=energy_phase_C.device_id - and total_energy.date=energy_phase_C.date + and total_energy.date=energy_phase_C.date; + + + diff --git a/libs/common/src/sql/queries/fact_hourly_active_energy/fact_hourly_active_energy.sql b/libs/common/src/sql/queries/fact_hourly_active_energy/fact_hourly_active_energy.sql new file mode 100644 index 0000000..d19b154 --- /dev/null +++ b/libs/common/src/sql/queries/fact_hourly_active_energy/fact_hourly_active_energy.sql @@ -0,0 +1,65 @@ +-- model shows the energy consumed per day per device + +WITH total_energy AS ( + SELECT + device_id, + event_time::date AS date, + MIN(value)::integer AS min_value, + MAX(value)::integer AS max_value + FROM "device-status-log" + where code='ActivePower' + GROUP BY device_id, date +) + +, energy_phase_A AS ( + SELECT + device_id, + event_time::date AS date, + MIN(value)::integer AS min_value, + MAX(value)::integer AS max_value + FROM "device-status-log" + where code='ActivePowerA' + GROUP BY device_id, date +) + +, energy_phase_B AS ( + SELECT + device_id, + event_time::date AS date, + MIN(value)::integer AS min_value, + MAX(value)::integer AS max_value + FROM "device-status-log" + where code='ActivePowerB' + GROUP BY device_id, date +) + +, energy_phase_C AS ( + SELECT + device_id, + event_time::date AS date, + MIN(value)::integer AS min_value, + MAX(value)::integer AS max_value + FROM "device-status-log" + where code='ActivePowerC' + GROUP BY device_id, date +) + + +SELECT + total_energy.device_id, + total_energy.date, + (total_energy.max_value-total_energy.min_value) as energy_consumed_kW, + (energy_phase_A.max_value-energy_phase_A.min_value) as energy_consumed_A, + (energy_phase_B.max_value-energy_phase_B.min_value) as energy_consumed_B, + (energy_phase_C.max_value-energy_phase_C.min_value) as energy_consumed_C +FROM total_energy +JOIN energy_phase_A + ON total_energy.device_id=energy_phase_A.device_id + and total_energy.date=energy_phase_A.date +JOIN energy_phase_B + ON total_energy.device_id=energy_phase_B.device_id + and total_energy.date=energy_phase_B.date +JOIN energy_phase_C + ON total_energy.device_id=energy_phase_C.device_id + and total_energy.date=energy_phase_C.date; + \ No newline at end of file diff --git a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql new file mode 100644 index 0000000..60de9fe --- /dev/null +++ b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql @@ -0,0 +1,71 @@ +WITH total_energy AS ( + SELECT + device_id, + event_time::date AS date, + EXTRACT(HOUR FROM event_time) AS hour, + MIN(value)::integer AS min_value, + MAX(value)::integer AS max_value + FROM "device-status-log" + WHERE code = 'EnergyConsumed' + GROUP BY device_id, date, hour +), + +energy_phase_A AS ( + SELECT + device_id, + event_time::date AS date, + EXTRACT(HOUR FROM event_time) AS hour, + MIN(value)::integer AS min_value, + MAX(value)::integer AS max_value + FROM "device-status-log" + WHERE code = 'EnergyConsumedA' + GROUP BY device_id, date, hour +), + +energy_phase_B AS ( + SELECT + device_id, + event_time::date AS date, + EXTRACT(HOUR FROM event_time) AS hour, + MIN(value)::integer AS min_value, + MAX(value)::integer AS max_value + FROM "device-status-log" + WHERE code = 'EnergyConsumedB' + GROUP BY device_id, date, hour +), + +energy_phase_C AS ( + SELECT + device_id, + event_time::date AS date, + EXTRACT(HOUR FROM event_time) AS hour, + MIN(value)::integer AS min_value, + MAX(value)::integer AS max_value + FROM "device-status-log" + WHERE code = 'EnergyConsumedC' + GROUP BY device_id, date, hour +) + +SELECT + total_energy.device_id, + total_energy.date, + total_energy.hour, + (total_energy.max_value - total_energy.min_value) AS energy_consumed_kW, + (energy_phase_A.max_value - energy_phase_A.min_value) AS energy_consumed_A, + (energy_phase_B.max_value - energy_phase_B.min_value) AS energy_consumed_B, + (energy_phase_C.max_value - energy_phase_C.min_value) AS energy_consumed_C +FROM total_energy +JOIN energy_phase_A + ON total_energy.device_id = energy_phase_A.device_id + AND total_energy.date = energy_phase_A.date + AND total_energy.hour = energy_phase_A.hour +JOIN energy_phase_B + ON total_energy.device_id = energy_phase_B.device_id + AND total_energy.date = energy_phase_B.date + AND total_energy.hour = energy_phase_B.hour +JOIN energy_phase_C + ON total_energy.device_id = energy_phase_C.device_id + AND total_energy.date = energy_phase_C.date + AND total_energy.hour = energy_phase_C.hour +ORDER BY total_energy.device_id, total_energy.date, total_energy.hour; +