I have a table which contains timestamps (called triggers) per business day (CTRL_DT). I need to process data for a given business date by selecting rows between previous days trigger timestamp and current days trigger. By using LEAD(), I was able to get below output. This only works if there are triggers every day.
Let's say, one trigger is missed. How do I rewrite the same query without much complexity but get the expected output.
Input Data: (if you observe, ctrl_dt 2023-02-16 is missed).
| CAPTURE_DT | CTRL_DT | INST |
|---|---|---|
| 2023-02-17 19:21:30.612814 | 2023-02-18 | AAA |
| 2023-02-16 19:18:16.045126 | 2023-02-17 | AAA |
| 2023-02-14 18:58:40.927273 | 2023-02-15 | AAA |
| 2023-02-13 21:43:38.832417 | 2023-02-14 | AAA |
| 2023-02-12 18:30:40.595363 | 2023-02-13 | AAA |
Expected Output:
| STARTTIME | ENDTIME | BS_DATE |
|---|---|---|
| 2023-02-16 19:18:16.045126 | 2023-02-17 19:21:30.612814 | 2023-02-17 |
| 2023-02-16 19:18:16.045126 | 2023-02-16 | |
| 2023-02-14 18:58:40.927273 | 2023-02-15 | |
| 2023-02-13 21:43:38.832417 | 2023-02-14 18:58:40.927273 | 2023-02-14 |
| 2023-02-12 18:30:40.595363 | 2023-02-13 21:43:38.832417 | 2023-02-13 |
| 2023-02-12 18:30:40.595363 | 2023-02-12 |
However, I'm getting
| STARTTIME | ENDTIME | BS_DATE |
|---|---|---|
| 2023-02-16 19:18:16.045126 | 2023-02-17 19:21:30.612814 | 2023-02-17 |
| 2023-02-14 18:58:40.927273 | 2023-02-16 19:18:16.045126 | 2023-02-16 |
| 2023-02-13 21:43:38.832417 | 2023-02-14 18:58:40.927273 | 2023-02-14 |
| 2023-02-12 18:30:40.595363 | 2023-02-13 21:43:38.832417 | 2023-02-13 |
| 2023-02-12 18:30:40.595363 | 2023-02-12 |
Query Used:
WITH
EVENT_TRIGGER
AS
(SELECT '2023-02-17 19:21:30.612814' CAPTURE_DT, '2023-02-18' CTRL_DT, 'AAA' INST FROM DUAL
UNION ALL
SELECT '2023-02-16 19:18:16.045126' CAPTURE_DT, '2023-02-17' CTRL_DT, 'AAA' INST FROM DUAL
UNION ALL
SELECT '2023-02-14 18:58:40.927273' CAPTURE_DT, '2023-02-15' CTRL_DT, 'AAA' INST FROM DUAL
UNION ALL
SELECT '2023-02-13 21:43:38.832417' CAPTURE_DT, '2023-02-14' CTRL_DT, 'AAA' INST FROM DUAL
UNION ALL
SELECT '2023-02-12 18:30:40.595363' CAPTURE_DT, '2023-02-13' CTRL_DT, 'AAA' INST FROM DUAL)
SELECT LEAD (CAPTURE_DT) OVER (PARTITION BY INST ORDER BY CTRL_DT DESC) AS STARTTIME,
CAPTURE_DT AS ENDTIME,
TO_DATE (CTRL_DT, 'YYYY-MM-DD') - 1 AS BS_DATE
FROM EVENT_TRIGGER
WHERE INST = 'AAA';
You can generate a calendar and then use a
PARTITIONedOUTER JOIN:Which, outputs:
fiddle