I'm trying to get an entry from a table that has START_TIME and FINISH_TIME. If FINISH_TIME is null then have to get the next START_TIME. Below is the query I tried, also have to use the lead function for optimization
CREATE TABLE RUN_LOG (
ID int,
PROCESS_TYPE varchar(20),
START_TIME DATETIME,
FINISH_TIME DATETIME
)
INSERT INTO RUN_LOG (ID,PROCESS_TYPE,START_TIME,FINISH_TIME)
VALUES (1,'A','2023-08-10 10:11:00',NULL),
(2,'A','2023-08-10 12:11:00','2023-08-11 12:24:00'),
(3,'B','2023-08-10 12:25:00','2023-08-11 12:44:00')
CREATE TABLE VALIDATION_LOG (
TABLE_NAME VARCHAR(50),
PROCESS_TYPE varchar(20),
PROCESS_TIME TIMESTAMP,
REMARK VARCHAR(1000))
INSERT INTO VALIDATION_LOG (TABLE_NAME,PROCESS_TIME,REMARK)
VALUES ('TAB1','A','2023-08-11 12:05:00', 'ERROR ON STOREID'),
('TAB2','b','2023-08-11 12:26:00', 'NULL VALUES IN CARD')
CREATE TABLE PROCESS_TYPE (
PROCESS_TYPE varchar(20),
PROCESS_CATALOGUE TIMESTAMP)
INSERT INTO PROCESS_TYPE (PROCESS_TYPE,PROCESS_CATALOGUE)
VALUES ('A','ELT JOB'),
('B','EXPORT')
In the above script PROCESS_TYPE 'A' has no FINISH_TIME in row 1, so I need to take row 1 START_TIME and row 2 START_TIME to find if that falls between VL.PROCESS_TIME.
SELECT
RH.PROCESS_TYPE, PT.PROCESS_TYPE, VL.REMARK,
VL.TABLE_NAME, VL.PROCESS_TIME
FROM
RUN_LOG AS RH
INNER JOIN
VALIDATION_LOG VL ON RH.PROCESS_TYPE = VL.PROCESS_TYPE
AND VL.PROCESS_TIME BETWEEN RH.START_TIME AND ISNULL(RH.FINISH_TIME, (SELECT LEAD(RH.START_TIME, 10) OVER (ORDER BY RH.PR_RUN_LOG_ID) dd FROM RUN_LOG))
INNER JOIN
PROCESS_TYPE PT ON PT.PROCESS_TYPE = RH.PROCESS_TYPE
WHERE
VL.REMARK LIKE '%ERROR%'
AND PT.PROCESS_CATALOGUE LIKE '%JOB%'
AND VL.PROCESS_TIME > GETDATE()