If you want the earliest row in the set of rows with the latest client_status
then, using MATCH_RECOGNIZE
to perform row-by-row processing:
SELECT *
FROM table_name
MATCH_RECOGNIZE(
ORDER BY sym_run_date DESC
ALL ROWS PER MATCH
PATTERN (^ {- (same_status*) -} next_row )
DEFINE same_status AS client_status = NEXT(client_status)
)
or, using analytic functions:
SELECT SYM_RUN_DATE,
CLIENT_NO,
CLIENT_STATUS
FROM (
SELECT SYM_RUN_DATE,
CLIENT_NO,
CLIENT_STATUS,
ROW_NUMBER() OVER (ORDER BY sym_run_date DESC)
- ROW_NUMBER() OVER (PARTITION BY client_status ORDER BY sym_run_date DESC) AS grp
FROM table_name
)
WHERE grp = 0
ORDER BY sym_run_date
FETCH FIRST ROW ONLY;
Which, for the sample data:
CREATE TABLE table_name (SYM_RUN_DATE, CLIENT_NO, CLIENT_STATUS) AS
SELECT DATE '2023-03-31', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-30', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-29', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-28', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-27', '00019872', 1 FROM DUAL UNION ALL
SELECT DATE '2023-03-26', '00019872', 1 FROM DUAL UNION ALL
SELECT DATE '2023-03-25', '00019872', 1 FROM DUAL UNION ALL
SELECT DATE '2023-03-24', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-23', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-22', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-21', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-20', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-19', '00019872', 2 FROM DUAL UNION ALL
SELECT DATE '2023-03-18', '00019872', 1 FROM DUAL UNION ALL
SELECT DATE '2023-03-17', '00019872', 1 FROM DUAL UNION ALL
SELECT DATE '2023-03-16', '00019872', 1 FROM DUAL;
Both output:
SYM_RUN_DATE |
CLIENT_NO |
CLIENT_STATUS |
2023-03-28 00:00:00 |
00019872 |
2 |
fiddle