Вы можете попробовать SQL для сопоставления с образцом (MATCH_RECOGNIZE):
WITH t(LogId, JobID, LogDate, JobStatus) AS
(SELECT 1, 1, TO_DATE('09/01/2019','mm/dd/YYYY'), 'active' FROM dual UNION ALL
SELECT 2, 1, TO_DATE('09/02/2019','mm/dd/YYYY'), 'end' FROM dual UNION ALL
SELECT 3, 2, TO_DATE('08/03/2019','mm/dd/YYYY'), 'active' FROM dual UNION ALL
SELECT 4, 2, TO_DATE('08/05/2019','mm/dd/YYYY'), 'suspended' FROM dual UNION ALL
SELECT 5, 2, TO_DATE('08/08/2019','mm/dd/YYYY'), 'active' FROM dual UNION ALL
SELECT 6, 2, TO_DATE('08/15/2019','mm/dd/YYYY'), 'end' FROM dual UNION ALL
SELECT 7, 3, TO_DATE('06/01/2019','mm/dd/YYYY'), 'active' FROM dual UNION ALL
SELECT 8, 3, TO_DATE('06/04/2019','mm/dd/YYYY'), 'suspended' FROM dual UNION ALL
SELECT 9, 3, TO_DATE('06/08/2019','mm/dd/YYYY'), 'active' FROM dual UNION ALL
SELECT 10, 3, TO_DATE('06/12/2019','mm/dd/YYYY'), 'suspended' FROM dual UNION ALL
SELECT 11, 3, TO_DATE('06/18/2019','mm/dd/YYYY'), 'active' FROM dual UNION ALL
SELECT 12, 3, TO_DATE('06/25/2019','mm/dd/YYYY'), 'end' FROM dual),
m as
(SELECT JobID, ACTIVE_DATE, END_DATE, SUSPEND_DAYS, JobStatus, var_match
FROM t
MATCH_RECOGNIZE (
PARTITION BY JobID
ORDER BY LogId
MEASURES
CLASSIFIER() AS var_match,
FINAL FIRST(s_ACTIVE.LogDate) AS ACTIVE_DATE,
FINAL LAST(s_END.LogDate) AS END_DATE,
(s_REACTIVE.LogDate - s_SUSPENDED.LogDate) AS SUSPEND_DAYS
ALL ROWS PER MATCH
PATTERN ( s_ACTIVE (s_SUSPENDED s_REACTIVE)* s_END )
DEFINE
s_ACTIVE AS JobStatus = 'active',
s_REACTIVE AS JobStatus = 'active',
s_END AS JobStatus = 'end',
s_SUSPENDED AS JobStatus = 'suspended'
)
)
SELECT JobID,
MIN(ACTIVE_DATE) AS START_DATE,
MAX(END_DATE) AS END_DATE,
SUM(SUSPEND_DAYS) AS SUSPENDED_DAYS,
MAX(END_DATE) - MIN(ACTIVE_DATE) - NVL(SUM(SUSPEND_DAYS),0) AS ACTIVE_DAYS,
EXTRACT(DAY FROM (LAST_DAY(MIN(ACTIVE_DATE)))) - (MAX(END_DATE) - MIN(ACTIVE_DATE) - NVL(SUM(SUSPEND_DAYS),0)) AS ACTIVE_DAYS_FROM_CURRENT_MONTH
FROM m
WHERE JobStatus = 'active'
GROUP BY JobID
ORDER BY JobID;
Результат:
+-------------------------------------------------------------------------------------+
|JOBID|START_DATE|END_DATE |SUSPENDED_DAYS|ACTIVE_DAYS|ACTIVE_DAYS_FROM_CURRENT_MONTH|
+-------------------------------------------------------------------------------------+
|1 |01.09.2019|02.09.2019| |1 |29 |
|2 |03.08.2019|15.08.2019|3 |9 |22 |
|3 |01.06.2019|25.06.2019|10 |14 |16 |
+-------------------------------------------------------------------------------------+