diff --git a/fact_daily_space_presence_duration/fact_daily_space_presence_duration.sql b/fact_daily_space_presence_duration/fact_daily_space_presence_duration.sql index 81061b5..25a5a5b 100644 --- a/fact_daily_space_presence_duration/fact_daily_space_presence_duration.sql +++ b/fact_daily_space_presence_duration/fact_daily_space_presence_duration.sql @@ -39,7 +39,7 @@ WITH start_date AS ( WHERE prev_none_flag = 1 ) -, overlaping_none_presence AS ( +, overlaping_none_presence AS ( --assuming only 2 devices SELECT a.space_id, GREATEST(a.start_time, b.start_time) AS overlap_start, @@ -53,19 +53,31 @@ WITH start_date AS ( AND b.start_time < a.end_time ) + +, expanded_overlapping_none_presence AS ( + SELECT distinct + o.space_id, + gs.date AS missing_date, + CASE + WHEN DATE(o.overlap_start) <> DATE(o.overlap_end) THEN 86400 + ELSE EXTRACT(EPOCH FROM (LEAST(o.overlap_end, gs.date + INTERVAL '1 day') - GREATEST(o.overlap_start, gs.date))) + END AS missing_seconds + FROM overlaping_none_presence o + CROSS JOIN LATERAL generate_series(DATE(o.overlap_start), DATE(o.overlap_end) - INTERVAL '1 day', '1 day') AS gs(date) +) + + , daily_total_occupancy AS ( SELECT t.space_id, DATE(t.start_time) AS occupancy_date, - 86,400 - COALESCE(SUM(o.overlap_duration_seconds), 0) AS total_occupancy_seconds + GREATEST(0, LEAST(86400, SUM(EXTRACT(EPOCH FROM (t.end_time - t.start_time))) - + COALESCE(SUM(e.missing_seconds), 0))) AS total_presence_seconds FROM time_intervals t - LEFT JOIN overlaping_none_presence o - ON t.space_id = o.space_id - AND t.start_time < o.overlap_end - AND o.overlap_start < t.end_time + LEFT JOIN expanded_overlapping_none_presence e + ON t.space_id = e.space_id + AND DATE(t.start_time) = e.missing_date GROUP BY t.space_id, DATE(t.start_time) ) -SELECT * FROM daily_total_occupancy - - +SELECT * FROM daily_total_occupancy;