I need help with determining correct STATUS of an asset, start & final refresh time correctly as one asset can be tagged to multiple processes having different status.
START TIME: It should give minimum start time among the processes under that asset which starts earliest and only if none of the processes start under an asset it should be NULL
FINAL_REFRESH_TIME: It should give final job completion time among all processes under an asset only if all 3 processes completed, else it should show as NULL
STATUS: Only one status per asset depends on underlying processes and status should show as per given chart
Case 1: Status should show as 'R' or Running
Asset_ID Process_Id Status
10080 500 C
10080 501 C
10080 502 R
Case 2: Status should show as 'C' or Completed
Asseet_id Process_Id Status
10080 500 C
10080 501 C
10080 502 C
Case 3: Status should show as 'Waiting'
Asseet_id Process_Id Status
10080 500 C
10080 501 C
10080 502 N
Case 4: Status should show as 'N' or 'Not Started'
Asseet_id Process_Id Status
10080 500 N
10080 501 N
10080 502 N
I have prepared below query but this is giving multiple rows for an asset id 10080 but there should be only one row per asset:
SELECT
MODULE_BASED.APPLICATION,
MODULE_BASED.ASSET_TYP,
MODULE_BASED.ASSET_NAME,
MODULE_BASED.MODULE_NAME,
MODULE_BASED.DATA_DATE,
CASE
WHEN MODULE_BASED.STATUS IN ('Completed','In Progress','Not Started') AND MAX_STATUS = 'In Progress' THEN 'In Progress'
WHEN MODULE_BASED.STATUS IN ('Completed','In Progress','Not Started') AND MAX_STATUS = 'Not Started' THEN 'In Progress'
WHEN MODULE_BASED.STATUS IN ('Completed') AND MAX_STATUS = 'Completed' THEN 'Completed'
WHEN MODULE_BASED.STATUS IN ('Not Started') AND MAX_STATUS = 'Not Started' THEN 'Not Started'
WHEN MODULE_BASED.STATUS IN ('In Progress') AND MAX_STATUS = 'In Progress' THEN 'In Progress'
WHEN MODULE_BASED.STATUS IN ('Completed','Not Started') AND MAX_STATUS = 'Not Started' THEN 'Waiting'
WHEN MODULE_BASED.STATUS IN ('Failed','Not Started','In Progress','Completed') AND MAX_STATUS = 'Failed' THEN 'Failed'
END AS STATUS,
MIN(MODULE_BASED.START_TIME) AS START_TIME,
MAX(MODULE_BASED.END_TIME) AS END_TIME,
SUBSTRING((TRIM((CAST(((CAST(MAX(MODULE_BASED.END_TIME) AS TIMESTAMP(0)) - CAST(MIN(MODULE_BASED.START_TIME) AS TIMESTAMP(0))) DAY(4) TO SECOND) AS VARCHAR(50))))),2,9) AS DURATION
FROM
(
SELECT
QRY3.APPLICATION,
QRY3.ASSET_TYP,
QRY3.ASSET_NAME,
QRY3.MODULE_NAME,
QRY3.COMPLETING_PROCESS_ID,
QRY3.DATA_DATE,
QRY3.START_TIME,
QRY3.END_TIME,
SUBSTRING((TRIM((CAST(((CAST(QRY3.END_TIME AS TIMESTAMP(0)) - CAST(QRY3.START_TIME AS TIMESTAMP(0))) DAY(4) TO SECOND)AS VARCHAR(50))))),2,9) AS DURATION,
(TRIM((CAST(((CAST(QRY3.END_TIME AS TIMESTAMP(0)) - CAST(QRY3.START_TIME AS TIMESTAMP(0))) DAY(4) TO SECOND)AS VARCHAR(50))))) AS DURATION_TIMESTAMP,
((CAST(QRY3.END_TIME AS TIMESTAMP(0)) - QRY3.START_TIME) DAY(4) to SECOND(4)) AS t1,
(EXTRACT(DAY from t1)*(24*60*60) +
EXTRACT(HOUR from t1)*(60*60) +
EXTRACT(MINUTE from t1)*60 +
EXTRACT(SECOND from t1)
) AS Required_Output,
CASE WHEN ETL1.PROCESS_RUN_STATUS_CD = 'S' THEN 'Completed'
WHEN ETL1.PROCESS_RUN_STATUS_CD = 'R' THEN 'In Progress'
WHEN ETL1.PROCESS_RUN_STATUS_CD = 'N' THEN 'Not Started'
WHEN ETL1.PROCESS_RUN_STATUS_CD = 'F' THEN 'Failed'
END AS STATUS
FROM
(
SELECT
QRY2.APPLICATION,
QRY2.ASSET_TYP,
QRY2.ASSET_NAME,
QRY2.MODULE_NAME,
QRY2.COMPLETING_PROCESS_ID,
QRY2.DATA_DATE
,MIN(QRY2.START_TIME) OVER(PARTITION BY QRY2.APPLICATION,QRY2.ASSET_TYP,QRY2.ASSET_NAME,QRY2.MODULE_NAME,QRY2.COMPLETING_PROCESS_ID,QRY2.DATA_DATE)AS START_TIME
,MAX(QRY2.END_TIME) OVER(PARTITION BY QRY2.APPLICATION,QRY2.ASSET_TYP,QRY2.ASSET_NAME,QRY2.MODULE_NAME,QRY2.COMPLETING_PROCESS_ID,QRY2.DATA_DATE)AS END_TIME
,MAX(QRY2.RUN_ID) OVER(PARTITION BY QRY2.APPLICATION,QRY2.ASSET_TYP,QRY2.ASSET_NAME,QRY2.MODULE_NAME,QRY2.COMPLETING_PROCESS_ID,QRY2.DATA_DATE)AS RUN_ID
FROM
(
SELECT
QRY1.APPLICATION,
QRY1.ASSET_TYP,
QRY1.ASSET_NAME,
QRY1.MODULE_NAME,
QRY1.COMPLETING_PROCESS_ID,
QRY1.DATA_DATE,
ETL.PROCESS_RUN_STATUS_CD,
ETL.PROCESS_START_TS AS START_TIME
,ETL.PROCESS_END_TS AS END_TIME
,ETL.RUN_ID
FROM
(
select MASTER.ASSET_ID,
MASTER.APPLICATION,
MASTER.ASSET_TYP,
MASTER.ASSET_NAME,
MASTER.MODULE_NAME,
DEPEND.COMPLETING_PROCESS_ID,
CAL.CALENDAR_DAY_DT AS RUN_DATE,
(cast(CAL.CALENDAR_DAY_DT as format 'YYYY-MM-DD')+ cast(DEPEND.DATA_DELAY as interval DAY)) AS DATA_DATE,
DEPEND.COMPL_SESSION_NAME
from
NDW_EBI_DMR_DEV_TABLES.ASSET_CONFIG MASTER
INNER JOIN
NDW_EBI_DMR_DEV_TABLES.ASSET_DEPENDENCY_CONFIG DEPEND
ON
MASTER.ASSET_ID = DEPEND.ASSET_ID
inner join
ndw_base_views.fiscal_calendar cal
on
1=1
and
CALENDAR_DAY_DT BETWEEN '2023-06-02' AND '2023-06-02'
where
DEPEND.PRCS_CNTRL_STORE_TYP = 'NDW_EBI_DMR_SHARED_VIEWS.PROCESS_CONTROL'
AND MASTER.ASSET_ID = 10080
GROUP BY 1,2,3,4,5,6,7,8,9
)QRY1
LEFT JOIN
NDW_EBI_DMR_SHARED_VIEWS.PROCESS_CONTROL ETL
ON
ETL.PROCESS_ID = QRY1.COMPLETING_PROCESS_ID
AND ETL.LOAD_START_TS = QRY1.DATA_DATE
)QRY2
)QRY3
INNER JOIN
NDW_EBI_DMR_SHARED_VIEWS.PROCESS_CONTROL ETL1
ON
ETL1.PROCESS_ID = QRY3.COMPLETING_PROCESS_ID
AND ETL1.RUN_ID = QRY3.RUN_ID
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13
) MODULE_BASED
GROUP BY 1,2,3,4,5,7;
Output i am getting:
Enterprise,Care Data Assets (Xfinity 2.0),NSD,Business Critical,2023-06-01,2023-06-01 06:00:34,2023-06-02 06:23:33, 00:22:59, Completed
Enterprise,Care Data Assets (Xfinity 2.0),NSD,Business Critical,2023-06-01,2023-06-02 07:36:20,2023-06-02 18:00:34, 08:11:16, Running
Output i want:
Enterprise,Care Data Assets (Xfinity 2.0),NSD,Business Critical,2023-06-01,2023-06-01 06:00:34,2023-06-02 18:00:34, 18:00:00, Running
Thanks,
Debasis