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