mirror of
https://github.com/SyncrowIOT/backend.git
synced 2026-10-23 06:57:55 +00:00
feat: add SQL procedures for daily, hourly, and monthly energy consumption data
This commit is contained in:
+111
@@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
+113
@@ -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;
|
||||||
+107
@@ -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;
|
||||||
|
|
||||||
Reference in New Issue
Block a user