From 22436af903804361c78db32a5f7be6eb74ae3895 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Fri, 2 May 2025 12:37:29 +0300 Subject: [PATCH 01/10] daily occupancy procedure --- .../procedures/fact_space_occupancy/.Rhistory | 0 .../procedure_fact_daily_space_occupancy.sql | 80 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 libs/common/src/sql/procedures/fact_space_occupancy/.Rhistory create mode 100644 libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/.Rhistory b/libs/common/src/sql/procedures/fact_space_occupancy/.Rhistory new file mode 100644 index 0000000..e69de29 diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql new file mode 100644 index 0000000..a7f230f --- /dev/null +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql @@ -0,0 +1,80 @@ +WITH params AS ( + SELECT + $1::uuid AS device_id, + $2::text::date AS event_date +), + +device_logs AS ( + SELECT + device.uuid AS device_id, + device.created_at, + device.device_tuya_uuid, + device.space_device_uuid AS space_id, + "device-status-log".event_id, + "device-status-log".event_time::timestamp, + "device-status-log".code, + "device-status-log".value, + "device-status-log".log, + LAG("device-status-log".event_time::timestamp) + OVER (PARTITION BY device.uuid + ORDER BY "device-status-log".event_time) AS prev_timestamp, + LAG("device-status-log".value) + OVER (PARTITION BY device.uuid + ORDER BY "device-status-log".event_time) AS prev_value + FROM device + LEFT JOIN "device-status-log" + ON device.uuid = "device-status-log".device_id + LEFT JOIN product + ON product.uuid = device.product_device_uuid + JOIN params ON params.device_id = device.uuid::text + WHERE product.cat_name = 'hps' + AND "device-status-log".code = 'presence_state' + AND "device-status-log".event_time::date = params.event_date +), + +presence_detection AS ( + SELECT *, + CASE + WHEN value = 'motion' AND prev_value = 'none' THEN 1 ELSE 0 + END AS motion_detected, + CASE + WHEN value = 'presence' AND prev_value = 'none' THEN 1 ELSE 0 + END AS presence_detected + FROM device_logs +), + +presence_detection_summary AS ( + SELECT + pd.device_id, + d.subspace_id, + pd.space_id, + pd.event_time::date AS event_date, + EXTRACT(HOUR FROM date_trunc('hour', pd.event_time)) AS event_hour, + SUM(motion_detected) AS count_motion_detected, + SUM(presence_detected) AS count_presence_detected, + SUM(motion_detected + presence_detected) AS count_total_presence_detected + FROM presence_detection pd + LEFT JOIN device d ON d.uuid = pd.device_id + GROUP BY 1, 2, 3, 4, 5 +), + +all_dates_and_hours AS ( + SELECT device_id, subspace_id, space_id, event_date, event_hour + FROM ( + SELECT DISTINCT device_id, subspace_id, space_id, event_date + FROM presence_detection_summary + ) d, + generate_series(0, 23) AS event_hour +) + +SELECT + adah.*, + COALESCE(pds.count_motion_detected, 0) AS count_motion_detected, + COALESCE(pds.count_presence_detected, 0) AS count_presence_detected, + COALESCE(pds.count_total_presence_detected, 0) AS count_total_presence_detected +FROM all_dates_and_hours adah +LEFT JOIN presence_detection_summary pds + ON pds.device_id = adah.device_id + AND pds.event_date = adah.event_date + AND pds.event_hour = adah.event_hour +ORDER BY 1, 4, 5; \ No newline at end of file From 76806f8df4131e9f7029c12dcc550c8c01920a9b Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Fri, 2 May 2025 14:52:13 +0300 Subject: [PATCH 02/10] latest one --- .../procedure_fact_daily_space_occupancy.sql | 88 +++-------------- ...ice_presence_detected_insert_statement.sql | 95 +++++++++++++++++++ 2 files changed, 107 insertions(+), 76 deletions(-) create mode 100644 libs/common/src/sql/queries/fact_hourly_device_presence_detected/fact_daily_device_presence_detected_insert_statement.sql diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql index a7f230f..65771b6 100644 --- a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql @@ -1,80 +1,16 @@ WITH params AS ( SELECT - $1::uuid AS device_id, - $2::text::date AS event_date -), - -device_logs AS ( - SELECT - device.uuid AS device_id, - device.created_at, - device.device_tuya_uuid, - device.space_device_uuid AS space_id, - "device-status-log".event_id, - "device-status-log".event_time::timestamp, - "device-status-log".code, - "device-status-log".value, - "device-status-log".log, - LAG("device-status-log".event_time::timestamp) - OVER (PARTITION BY device.uuid - ORDER BY "device-status-log".event_time) AS prev_timestamp, - LAG("device-status-log".value) - OVER (PARTITION BY device.uuid - ORDER BY "device-status-log".event_time) AS prev_value - FROM device - LEFT JOIN "device-status-log" - ON device.uuid = "device-status-log".device_id - LEFT JOIN product - ON product.uuid = device.product_device_uuid - JOIN params ON params.device_id = device.uuid::text - WHERE product.cat_name = 'hps' - AND "device-status-log".code = 'presence_state' - AND "device-status-log".event_time::date = params.event_date -), - -presence_detection AS ( - SELECT *, - CASE - WHEN value = 'motion' AND prev_value = 'none' THEN 1 ELSE 0 - END AS motion_detected, - CASE - WHEN value = 'presence' AND prev_value = 'none' THEN 1 ELSE 0 - END AS presence_detected - FROM device_logs -), - -presence_detection_summary AS ( - SELECT - pd.device_id, - d.subspace_id, - pd.space_id, - pd.event_time::date AS event_date, - EXTRACT(HOUR FROM date_trunc('hour', pd.event_time)) AS event_hour, - SUM(motion_detected) AS count_motion_detected, - SUM(presence_detected) AS count_presence_detected, - SUM(motion_detected + presence_detected) AS count_total_presence_detected - FROM presence_detection pd - LEFT JOIN device d ON d.uuid = pd.device_id - GROUP BY 1, 2, 3, 4, 5 -), - -all_dates_and_hours AS ( - SELECT device_id, subspace_id, space_id, event_date, event_hour - FROM ( - SELECT DISTINCT device_id, subspace_id, space_id, event_date - FROM presence_detection_summary - ) d, - generate_series(0, 23) AS event_hour + --TO_DATE(NULLIF($2, ''), 'YYYY-MM-DD') AS event_date, + --string_to_array(NULLIF($4, ''), ',') AS device_ids, + NULL::date AS event_date, + ARRAY['8d2ae87f-4068-4f45-8eb7-9b5f5bf7c6c2'] AS device_ids ) -SELECT - adah.*, - COALESCE(pds.count_motion_detected, 0) AS count_motion_detected, - COALESCE(pds.count_presence_detected, 0) AS count_presence_detected, - COALESCE(pds.count_total_presence_detected, 0) AS count_total_presence_detected -FROM all_dates_and_hours adah -LEFT JOIN presence_detection_summary pds - ON pds.device_id = adah.device_id - AND pds.event_date = adah.event_date - AND pds.event_hour = adah.event_hour -ORDER BY 1, 4, 5; \ No newline at end of file +SELECT A.* +FROM public."presence-sensor-daily-detection" AS A +JOIN params P ON TRUE +WHERE A.device_uuid::text = ANY(P.device_ids) + AND ( + P.event_date IS NULL OR A.event_date = P.event_date OR A.event_date IS NULL + ) + order by A.device_uuid, A.event_date ; diff --git a/libs/common/src/sql/queries/fact_hourly_device_presence_detected/fact_daily_device_presence_detected_insert_statement.sql b/libs/common/src/sql/queries/fact_hourly_device_presence_detected/fact_daily_device_presence_detected_insert_statement.sql new file mode 100644 index 0000000..a319037 --- /dev/null +++ b/libs/common/src/sql/queries/fact_hourly_device_presence_detected/fact_daily_device_presence_detected_insert_statement.sql @@ -0,0 +1,95 @@ +-- This model shows the number of times a presence was detected per hour, per day. +INSERT INTO public."presence-sensor-daily-detection" ( + device_uuid, + event_date, + count_motion_detected, + count_presence_detected, + count_total_presence_detected +) +WITH device_logs AS ( + SELECT + device.uuid AS device_id, + device.created_at, + device.device_tuya_uuid, + device.space_device_uuid AS space_id, + "device-status-log".event_id, + "device-status-log".event_time::timestamp, + "device-status-log".code, + "device-status-log".value, + "device-status-log".log, + LAG("device-status-log".event_time::timestamp) + OVER (PARTITION BY device.uuid + ORDER BY "device-status-log".event_time) AS prev_timestamp, + LAG("device-status-log".value) + OVER (PARTITION BY device.uuid + ORDER BY "device-status-log".event_time) AS prev_value + FROM device + LEFT JOIN "device-status-log" + ON device.uuid = "device-status-log".device_id + LEFT JOIN product + ON product.uuid = device.product_device_uuid + WHERE product.cat_name = 'hps' + AND "device-status-log".code = 'presence_state' +), + +presence_detection AS ( + SELECT *, + CASE + WHEN value = 'motion' AND prev_value = 'none' THEN 1 ELSE 0 + END AS motion_detected, + CASE + WHEN value = 'presence' AND prev_value = 'none' THEN 1 ELSE 0 + END AS presence_detected + FROM device_logs +), + +presence_detection_summary AS ( + SELECT + pd.device_id, + d.subspace_id, + pd.space_id, + pd.event_time::date AS event_date, + EXTRACT(HOUR FROM date_trunc('hour', pd.event_time)) AS event_hour, + SUM(motion_detected) AS count_motion_detected, + SUM(presence_detected) AS count_presence_detected, + SUM(motion_detected + presence_detected) AS count_total_presence_detected + FROM presence_detection pd + LEFT JOIN device d ON d.uuid = pd.device_id + GROUP BY 1, 2, 3, 4, 5 +), + +all_dates_and_hours AS ( + SELECT device_id, subspace_id, space_id, event_date, event_hour + FROM ( + SELECT DISTINCT device_id, subspace_id, space_id, event_date + FROM presence_detection_summary + ) d, + generate_series(0, 23) AS event_hour +), + +table_final AS ( + SELECT + adah.*, + COALESCE(pds.count_motion_detected, 0) AS count_motion_detected, + COALESCE(pds.count_presence_detected, 0) AS count_presence_detected, + COALESCE(pds.count_total_presence_detected, 0) AS count_total_presence_detected + FROM all_dates_and_hours adah + LEFT JOIN presence_detection_summary pds + ON pds.device_id = adah.device_id + AND pds.event_date = adah.event_date + AND pds.event_hour = adah.event_hour +) + +SELECT + device_id, + event_date, + SUM(count_motion_detected), + SUM(count_presence_detected), + SUM(count_total_presence_detected) +FROM table_final +GROUP BY 1, 2 +ON CONFLICT (device_uuid, event_date) DO UPDATE +SET + count_motion_detected = EXCLUDED.count_motion_detected, + count_presence_detected = EXCLUDED.count_presence_detected, + count_total_presence_detected = EXCLUDED.count_total_presence_detected; \ No newline at end of file From 606de2e0e35b7e97d3c3c9eb99d0293c94aa98dc Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Fri, 2 May 2025 14:55:51 +0300 Subject: [PATCH 03/10] commented out test --- .../procedure_fact_daily_space_occupancy.sql | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql index 65771b6..909f1a0 100644 --- a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql @@ -1,9 +1,7 @@ WITH params AS ( SELECT - --TO_DATE(NULLIF($2, ''), 'YYYY-MM-DD') AS event_date, - --string_to_array(NULLIF($4, ''), ',') AS device_ids, - NULL::date AS event_date, - ARRAY['8d2ae87f-4068-4f45-8eb7-9b5f5bf7c6c2'] AS device_ids + TO_DATE(NULLIF($2, ''), 'YYYY-MM-DD') AS event_date, + string_to_array(NULLIF($4, ''), ',') AS device_ids ) SELECT A.* From adf1c5e2e06e1212e010342f9ea541b9a4f00e02 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Wed, 7 May 2025 12:52:22 +0300 Subject: [PATCH 04/10] edit procedure --- ...onthly_space_energy_consumed_procedure.sql | 3 +- .../procedures/fact_space_occupancy/.Rhistory | 0 .../procedure_fact_daily_space_occupancy.sql | 47 +++++++++++++++---- 3 files changed, 40 insertions(+), 10 deletions(-) delete mode 100644 libs/common/src/sql/procedures/fact_space_occupancy/.Rhistory diff --git a/libs/common/src/sql/procedures/fact_space_energy_consumed/fact_monthly_space_energy_consumed_procedure.sql b/libs/common/src/sql/procedures/fact_space_energy_consumed/fact_monthly_space_energy_consumed_procedure.sql index 8002de6..5941d6b 100644 --- a/libs/common/src/sql/procedures/fact_space_energy_consumed/fact_monthly_space_energy_consumed_procedure.sql +++ b/libs/common/src/sql/procedures/fact_space_energy_consumed/fact_monthly_space_energy_consumed_procedure.sql @@ -17,4 +17,5 @@ JOIN params P ON TRUE WHERE B."uuid"::TEXT = ANY(P.device_ids) AND (P.start_date IS NULL OR A.date >= P.start_date) AND (P.end_date IS NULL OR A.date <= P.end_date) -GROUP BY 1; +GROUP BY 1 + diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/.Rhistory b/libs/common/src/sql/procedures/fact_space_occupancy/.Rhistory deleted file mode 100644 index e69de29..0000000 diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql index 909f1a0..b1b5d77 100644 --- a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql @@ -1,14 +1,43 @@ +-- will return the presence metrics for the days of the selected month WITH params AS ( SELECT - TO_DATE(NULLIF($2, ''), 'YYYY-MM-DD') AS event_date, + TO_DATE(NULLIF($2, ''), 'YYYY-MM') AS month, string_to_array(NULLIF($4, ''), ',') AS device_ids ) -SELECT A.* -FROM public."presence-sensor-daily-detection" AS A -JOIN params P ON TRUE -WHERE A.device_uuid::text = ANY(P.device_ids) - AND ( - P.event_date IS NULL OR A.event_date = P.event_date OR A.event_date IS NULL - ) - order by A.device_uuid, A.event_date ; +, final_data AS ( + SELECT + A.device_uuid, + A.event_date, + A.count_motion_detected, + A.count_presence_detected, + A.count_total_presence_detected + FROM public."presence-sensor-daily-detection" AS A + JOIN params P ON TRUE + WHERE A.device_uuid::text = ANY(P.device_ids) + AND (- + P.month IS NULL + OR date_trunc('month', A.event_date) = P.month + ) +) + +INSERT INTO public."presence-sensor-daily-detection" ( + device_uuid, + event_date, + count_motion_detected, + count_presence_detected, + count_total_presence_detected +) +SELECT + device_uuid, + event_date, + count_motion_detected, + count_presence_detected, + count_total_presence_detected +FROM final_data +ON CONFLICT (device_uuid, event_date) DO UPDATE +SET + count_motion_detected = EXCLUDED.count_motion_detected, + count_presence_detected = EXCLUDED.count_presence_detected, + count_total_presence_detected = EXCLUDED.count_total_presence_detected; + From ab89a13f95ada5fc87299541e0f3527f9c3b939e Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Wed, 7 May 2025 13:16:36 +0300 Subject: [PATCH 05/10] procedure --- .../procedure_fact_daily_space_occupancy.sql | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql index b1b5d77..c1160bc 100644 --- a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql @@ -39,5 +39,10 @@ ON CONFLICT (device_uuid, event_date) DO UPDATE SET count_motion_detected = EXCLUDED.count_motion_detected, count_presence_detected = EXCLUDED.count_presence_detected, - count_total_presence_detected = EXCLUDED.count_total_presence_detected; + count_total_presence_detected = EXCLUDED.count_total_presence_detected +WHERE + public."presence-sensor-daily-detection".count_motion_detected IS DISTINCT FROM EXCLUDED.count_motion_detected + OR public."presence-sensor-daily-detection".count_presence_detected IS DISTINCT FROM EXCLUDED.count_presence_detected + OR public."presence-sensor-daily-detection".count_total_presence_detected IS DISTINCT FROM EXCLUDED.count_total_presence_detected; + From 078de317e4e8e0c4316bf0ba6779d9ceef2a5390 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Wed, 7 May 2025 14:30:56 +0300 Subject: [PATCH 06/10] procedures --- .../procedure_fact_daily_space_occupancy.sql | 48 -------- ...dure_insert_fact_daily_space_occupancy.sql | 115 ++++++++++++++++++ ...dure_select_fact_daily_space_occupancy.sql | 19 +++ 3 files changed, 134 insertions(+), 48 deletions(-) delete mode 100644 libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql create mode 100644 libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql create mode 100644 libs/common/src/sql/procedures/fact_space_occupancy/procedure_select_fact_daily_space_occupancy.sql diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql deleted file mode 100644 index c1160bc..0000000 --- a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_fact_daily_space_occupancy.sql +++ /dev/null @@ -1,48 +0,0 @@ --- will return the presence metrics for the days of the selected month -WITH params AS ( - SELECT - TO_DATE(NULLIF($2, ''), 'YYYY-MM') AS month, - string_to_array(NULLIF($4, ''), ',') AS device_ids -) - -, final_data AS ( - SELECT - A.device_uuid, - A.event_date, - A.count_motion_detected, - A.count_presence_detected, - A.count_total_presence_detected - FROM public."presence-sensor-daily-detection" AS A - JOIN params P ON TRUE - WHERE A.device_uuid::text = ANY(P.device_ids) - AND (- - P.month IS NULL - OR date_trunc('month', A.event_date) = P.month - ) -) - -INSERT INTO public."presence-sensor-daily-detection" ( - device_uuid, - event_date, - count_motion_detected, - count_presence_detected, - count_total_presence_detected -) -SELECT - device_uuid, - event_date, - count_motion_detected, - count_presence_detected, - count_total_presence_detected -FROM final_data -ON CONFLICT (device_uuid, event_date) DO UPDATE -SET - count_motion_detected = EXCLUDED.count_motion_detected, - count_presence_detected = EXCLUDED.count_presence_detected, - count_total_presence_detected = EXCLUDED.count_total_presence_detected -WHERE - public."presence-sensor-daily-detection".count_motion_detected IS DISTINCT FROM EXCLUDED.count_motion_detected - OR public."presence-sensor-daily-detection".count_presence_detected IS DISTINCT FROM EXCLUDED.count_presence_detected - OR public."presence-sensor-daily-detection".count_total_presence_detected IS DISTINCT FROM EXCLUDED.count_total_presence_detected; - - diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql new file mode 100644 index 0000000..84e4dab --- /dev/null +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql @@ -0,0 +1,115 @@ +-- will return the presence metrics for the days of the selected month +WITH params AS ( + SELECT + TO_DATE(NULLIF($2, ''), 'YYYY-MM') AS month, + string_to_array(NULLIF($4, ''), ',') AS device_ids +), + +device_logs AS ( + SELECT + device.uuid AS device_id, + device.created_at, + device.device_tuya_uuid, + device.space_device_uuid AS space_id, + "device-status-log".event_id, + "device-status-log".event_time::timestamp, + "device-status-log".code, + "device-status-log".value, + "device-status-log".log, + LAG("device-status-log".event_time::timestamp) + OVER (PARTITION BY device.uuid + ORDER BY "device-status-log".event_time) AS prev_timestamp, + LAG("device-status-log".value) + OVER (PARTITION BY device.uuid + ORDER BY "device-status-log".event_time) AS prev_value + FROM device + LEFT JOIN "device-status-log" + ON device.uuid = "device-status-log".device_id + LEFT JOIN product + ON product.uuid = device.product_device_uuid + JOIN params P ON TRUE + WHERE product.cat_name = 'hps' + AND "device-status-log".code = 'presence_state' + AND device.uuid::text = ANY(P.device_ids) + AND (P.month IS NULL OR date_trunc('month', "device-status-log".event_time) = P.month) +), + +presence_detection AS ( + SELECT *, + CASE + WHEN value = 'motion' AND prev_value = 'none' THEN 1 ELSE 0 + END AS motion_detected, + CASE + WHEN value = 'presence' AND prev_value = 'none' THEN 1 ELSE 0 + END AS presence_detected + FROM device_logs +), + +presence_detection_summary AS ( + SELECT + pd.device_id, + d.subspace_id, + pd.space_id, + pd.event_time::date AS event_date, + EXTRACT(HOUR FROM pd.event_time)::int AS event_hour, + SUM(motion_detected) AS count_motion_detected, + SUM(presence_detected) AS count_presence_detected, + SUM(motion_detected + presence_detected) AS count_total_presence_detected + FROM presence_detection pd + LEFT JOIN device d ON d.uuid = pd.device_id + GROUP BY 1, 2, 3, 4, 5 +), + +all_dates_and_hours AS ( + SELECT device_id, subspace_id, space_id, event_date, event_hour + FROM ( + SELECT DISTINCT device_id, subspace_id, space_id, event_date + FROM presence_detection_summary + ) d + CROSS JOIN generate_series(0, 23) AS event_hour +), + +table_final AS ( + SELECT + adah.device_id, + adah.event_date, + COALESCE(pds.count_motion_detected, 0) AS count_motion_detected, + COALESCE(pds.count_presence_detected, 0) AS count_presence_detected, + COALESCE(pds.count_total_presence_detected, 0) AS count_total_presence_detected + FROM all_dates_and_hours adah + LEFT JOIN presence_detection_summary pds + ON pds.device_id = adah.device_id + AND pds.event_date = adah.event_date + AND pds.event_hour = adah.event_hour +), + +daily_aggregates AS ( + SELECT + device_id, + event_date, + SUM(count_motion_detected) AS count_motion_detected, + SUM(count_presence_detected) AS count_presence_detected, + SUM(count_total_presence_detected) AS count_total_presence_detected + FROM table_final + GROUP BY device_id, event_date +) + +INSERT INTO public."presence-sensor-daily-detection" ( + device_uuid, + event_date, + count_motion_detected, + count_presence_detected, + count_total_presence_detected +) +SELECT + device_id, + event_date, + count_motion_detected, + count_presence_detected, + count_total_presence_detected +FROM daily_aggregates +ON CONFLICT (device_uuid, event_date) DO UPDATE +SET + count_motion_detected = EXCLUDED.count_motion_detected, + count_presence_detected = EXCLUDED.count_presence_detected, + count_total_presence_detected = EXCLUDED.count_total_presence_detected; diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_select_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_select_fact_daily_space_occupancy.sql new file mode 100644 index 0000000..4b084c4 --- /dev/null +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_select_fact_daily_space_occupancy.sql @@ -0,0 +1,19 @@ +-- will return the presence metrics for the days of the selected month +WITH params AS ( + SELECT + TO_DATE(NULLIF($2, ''), 'YYYY-MM') AS month, + string_to_array(NULLIF($4, ''), ',') AS device_ids +) + + SELECT + A.device_uuid, + A.event_date, + A.count_motion_detected, + A.count_presence_detected, + A.count_total_presence_detected + FROM public."presence-sensor-daily-detection" AS A + JOIN params P ON TRUE + WHERE A.device_uuid::text = ANY(P.device_ids) + AND (P.month IS NULL + OR date_trunc('month', A.event_date) = P.month + ) \ No newline at end of file From 59ffa233ee4b3019c637cb9a5adfb17b97ea1623 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Wed, 7 May 2025 14:48:31 +0300 Subject: [PATCH 07/10] removed array --- .../procedure_insert_fact_daily_space_occupancy.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql index 84e4dab..13c8d6a 100644 --- a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql @@ -2,7 +2,7 @@ WITH params AS ( SELECT TO_DATE(NULLIF($2, ''), 'YYYY-MM') AS month, - string_to_array(NULLIF($4, ''), ',') AS device_ids + $4::text AS device_id ), device_logs AS ( @@ -30,7 +30,7 @@ device_logs AS ( JOIN params P ON TRUE WHERE product.cat_name = 'hps' AND "device-status-log".code = 'presence_state' - AND device.uuid::text = ANY(P.device_ids) + AND device.uuid::text = P.device_id AND (P.month IS NULL OR date_trunc('month', "device-status-log".event_time) = P.month) ), From 10005c7897f69263a3e01f2da88c91af97f0c977 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Wed, 7 May 2025 14:51:06 +0300 Subject: [PATCH 08/10] bug fix --- ...ice_presence_detected_insert_statement.sql | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/libs/common/src/sql/queries/fact_hourly_device_presence_detected/fact_daily_device_presence_detected_insert_statement.sql b/libs/common/src/sql/queries/fact_hourly_device_presence_detected/fact_daily_device_presence_detected_insert_statement.sql index a319037..ace575c 100644 --- a/libs/common/src/sql/queries/fact_hourly_device_presence_detected/fact_daily_device_presence_detected_insert_statement.sql +++ b/libs/common/src/sql/queries/fact_hourly_device_presence_detected/fact_daily_device_presence_detected_insert_statement.sql @@ -1,11 +1,4 @@ --- This model shows the number of times a presence was detected per hour, per day. -INSERT INTO public."presence-sensor-daily-detection" ( - device_uuid, - event_date, - count_motion_detected, - count_presence_detected, - count_total_presence_detected -) +-- This model shows the number of times a presence was detected per hour, per day WITH device_logs AS ( SELECT device.uuid AS device_id, @@ -49,7 +42,7 @@ presence_detection_summary AS ( d.subspace_id, pd.space_id, pd.event_time::date AS event_date, - EXTRACT(HOUR FROM date_trunc('hour', pd.event_time)) AS event_hour, + EXTRACT(HOUR FROM pd.event_time)::int AS event_hour, SUM(motion_detected) AS count_motion_detected, SUM(presence_detected) AS count_presence_detected, SUM(motion_detected + presence_detected) AS count_total_presence_detected @@ -63,13 +56,14 @@ all_dates_and_hours AS ( FROM ( SELECT DISTINCT device_id, subspace_id, space_id, event_date FROM presence_detection_summary - ) d, - generate_series(0, 23) AS event_hour + ) d + CROSS JOIN generate_series(0, 23) AS event_hour ), table_final AS ( SELECT - adah.*, + adah.device_id, + adah.event_date, COALESCE(pds.count_motion_detected, 0) AS count_motion_detected, COALESCE(pds.count_presence_detected, 0) AS count_presence_detected, COALESCE(pds.count_total_presence_detected, 0) AS count_total_presence_detected @@ -78,18 +72,35 @@ table_final AS ( ON pds.device_id = adah.device_id AND pds.event_date = adah.event_date AND pds.event_hour = adah.event_hour +), + +daily_aggregate AS ( + SELECT + device_id, + event_date, + SUM(count_motion_detected) AS count_motion_detected, + SUM(count_presence_detected) AS count_presence_detected, + SUM(count_total_presence_detected) AS count_total_presence_detected + FROM table_final + GROUP BY device_id, event_date ) -SELECT +INSERT INTO public."presence-sensor-daily-detection" ( + device_uuid, + event_date, + count_motion_detected, + count_presence_detected, + count_total_presence_detected +) +SELECT device_id, event_date, - SUM(count_motion_detected), - SUM(count_presence_detected), - SUM(count_total_presence_detected) -FROM table_final -GROUP BY 1, 2 + count_motion_detected, + count_presence_detected, + count_total_presence_detected +FROM daily_aggregate ON CONFLICT (device_uuid, event_date) DO UPDATE SET count_motion_detected = EXCLUDED.count_motion_detected, count_presence_detected = EXCLUDED.count_presence_detected, - count_total_presence_detected = EXCLUDED.count_total_presence_detected; \ No newline at end of file + count_total_presence_detected = EXCLUDED.count_total_presence_detected; From dc06cfff374dd28680379b701ae8fb5ad05f4e8b Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Thu, 8 May 2025 10:59:47 +0300 Subject: [PATCH 09/10] removed month to event_date --- .../procedure_insert_fact_daily_space_occupancy.sql | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql index 13c8d6a..7580f91 100644 --- a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql @@ -1,7 +1,6 @@ --- will return the presence metrics for the days of the selected month WITH params AS ( SELECT - TO_DATE(NULLIF($2, ''), 'YYYY-MM') AS month, + TO_DATE(NULLIF($2, ''), 'YYYY-MM-DD') AS event_date, $4::text AS device_id ), @@ -31,7 +30,7 @@ device_logs AS ( WHERE product.cat_name = 'hps' AND "device-status-log".code = 'presence_state' AND device.uuid::text = P.device_id - AND (P.month IS NULL OR date_trunc('month', "device-status-log".event_time) = P.month) + AND (P.event_date IS NULL OR "device-status-log".event_time = P.event_date) ), presence_detection AS ( From 303493ad4593aef008f2e04538706147b9dfeaa6 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Thu, 8 May 2025 12:37:11 +0300 Subject: [PATCH 10/10] bug fix of the date parameter --- .../procedure_insert_fact_daily_space_occupancy.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql index 7580f91..b3f121b 100644 --- a/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql +++ b/libs/common/src/sql/procedures/fact_space_occupancy/procedure_insert_fact_daily_space_occupancy.sql @@ -30,7 +30,7 @@ device_logs AS ( WHERE product.cat_name = 'hps' AND "device-status-log".code = 'presence_state' AND device.uuid::text = P.device_id - AND (P.event_date IS NULL OR "device-status-log".event_time = P.event_date) + AND (P.event_date IS NULL OR "device-status-log".event_time::date = P.event_date) ), presence_detection AS (