timescale / timescaledb-toolkit

Extension for more hyperfunctions, fully compatible with TimescaleDB and PostgreSQL 📈
https://www.timescale.com
Other
385 stars 47 forks source link

Division of extracted `duration_in` doesn't work as expected. #781

Open hobbes1069 opened 1 year ago

hobbes1069 commented 1 year ago

Relevant system information:

Describe the bug I'm attempting to aggregate state data for several CNC machines which can easily have a cycle time of 2-4.5 hours. I'm attempting to calculate %utilization by dividing the running time by the running+stopped time. I am extracting the duration to seconds and casting to a float but the results are still wrong in most cases.

Here's the query:

--- OEE Utilization reporting by shift, cell, asset
SELECT shift_start_time, shift_abcd as shift_abcd, cell, asset, duration_in(agg, 'Running') as running, duration_in(agg, 'Stopped') as stopped,
  duration_in(agg, 'Offline') as offline, duration_in(agg, 'Running') + duration_in(agg, 'Stopped') + duration_in(agg, 'Offline') as total,
CASE
    WHEN extract(SECONDS from duration_in(agg, 'Running')) + extract(SECONDS from duration_in(agg, 'Stopped')) = 0
    THEN 0
    ELSE cast(extract(SECONDS from duration_in(agg, 'Running')) as float) / cast(extract(SECONDS from duration_in(agg, 'Running')) + extract(SECONDS from duration_in(agg, 'Stopped')) as float)
END as utilization
from (SELECT time_bucket('12 hours', timestamp - interval '5 hours', 'America/Chicago') + interval '5 hours' as shift_start_time,
  shift_abcd.shift as shift_abcd, cell, asset, state_agg(timestamp, state) as agg
FROM machine_state 
left join shift_abcd on time_bucket('12 hours', timestamp - interval '5 hours', 'America/Chicago') + interval '5 hours' = public.shift_abcd.shift_start
GROUP BY shift_start_time, shift_abcd, cell, asset
ORDER BY shift_start_time desc)sub;

Expected behavior %utilization is calculated correctly.

Actual behavior % Utilization is calculated incorrectly in almost all cases:

Timestamp Shift Cell Asset Running Stopped Offline Total % Utilization
2023-11-01 05:00:00.000 -0500 B MV3 2759 01:00:59 00:40:31 00:00:00 01:41:30 0.6555555555555556
2023-11-01 05:00:00.000 -0500 B MH5 3618 02:25:35 00:53:22 00:00:00 03:18:57 0.6140350877192983
2023-11-01 05:00:00.000 -0500 B MV2 2635 00:02:38 01:52:31 00:00:00 01:55:09 0.5507246376811594
2023-11-01 05:00:00.000 -0500 B MV3 2760 00:00:00 02:41:42 00:00:00 02:41:42 0.0
2023-11-01 05:00:00.000 -0500 B MH4 3154 02:08:10 00:37:09 00:00:00 02:45:19 0.5263157894736842
2023-11-01 05:00:00.000 -0500 B MV3 2811 01:38:41 00:47:27 00:00:00 02:26:08 0.6029411764705882
2023-11-01 05:00:00.000 -0500 B MV1 2955 01:51:12 01:10:34 00:00:00 03:01:46 0.2608695652173913
2023-11-01 05:00:00.000 -0500 B MH1 3396 01:31:35 01:25:56 00:00:00 02:57:31 0.38461538461538464
2023-11-01 05:00:00.000 -0500 B MH1 3320 00:00:00 02:54:18 00:00:00 02:54:18 0.0
2023-11-01 05:00:00.000 -0500 B MH5 3619 02:37:21 00:42:00 00:00:00 03:19:21 1.0
2023-11-01 05:00:00.000 -0500 B MV4 2630 01:07:19 01:16:06 00:00:00 02:23:25 0.76
2023-11-01 05:00:00.000 -0500 B MH2 3155 00:38:23 01:26:07 00:00:00 02:04:30 0.7666666666666667
2023-11-01 05:00:00.000 -0500 B MH1 3395 00:31:29 02:23:52 00:00:00 02:55:21 0.35802469135802467
2023-11-01 05:00:00.000 -0500 B MV4 2791 01:41:51 00:51:31 00:00:00 02:33:22 0.6219512195121951
2023-11-01 05:00:00.000 -0500 B MH4 3153 01:30:50 00:25:49 00:00:00 01:56:39 0.5050505050505051
2023-11-01 05:00:00.000 -0500 B MV1 2956 00:30:39 00:21:27 00:00:00 00:52:06 0.5909090909090909
2023-11-01 05:00:00.000 -0500 B MH2 3156 00:39:59 01:25:20 00:00:00 02:05:19 0.7468354430379747
2023-11-01 05:00:00.000 -0500 B MH3 3354 01:15:28 02:03:12 00:00:00 03:18:40 0.7
2023-11-01 05:00:00.000 -0500 B MH4 3216 02:24:51 00:12:23 00:00:00 02:37:14 0.6891891891891891
2023-11-01 05:00:00.000 -0500 B MH3 3318 01:23:34 01:54:49 00:00:00 03:18:23 0.40963855421686746
2023-11-01 05:00:00.000 -0500 B MV1 2912 01:59:55 01:03:19 00:00:00 03:03:14 0.7432432432432432
2023-11-01 05:00:00.000 -0500 B MV2 2792 01:58:39 00:42:10 00:00:00 02:40:49 0.7959183673469388
2023-11-01 05:00:00.000 -0500 B MV2 2911 00:38:56 01:12:34 00:00:00 01:51:30 0.6222222222222222
2023-11-01 05:00:00.000 -0500 B MH3 3355 01:21:05 01:58:36 00:00:00 03:19:41 0.12195121951219512
2023-10-31 17:00:00.000 -0500 C MH2 3155 07:45:57 04:12:39 00:00:00 11:58:36 0.59375
2023-10-31 17:00:00.000 -0500 C MH5 3619 10:00:15 01:37:02 00:00:00 11:37:17 0.8823529411764706
2023-10-31 17:00:00.000 -0500 C MH4 3154 00:00:07 00:44:57 00:00:00 00:45:04 0.109375
2023-10-31 17:00:00.000 -0500 C MH3 3318 08:46:41 03:00:54 00:00:00 11:47:35 0.43157894736842106
2023-10-31 17:00:00.000 -0500 C MH4 3216 08:14:49 03:26:48 00:00:00 11:41:37 0.5051546391752577

Additional context I can provide raw data if needed but I may need to sanitize it.