I have a table structure called test_table like this:
Timestamp Value 08:45:45 C 08:45:59 E 08:46:52 V 08:46:59 C 08:47:09 C 08:48:00 C 08:48:30 C 08:48:55 C 08:49:45 E 08:50:45 E 08:41:45 V
and so on..
It is a large table and has about 3000 rows. I want to find the section of the table (start and end timestamp) for the longest running occurrence of “C” values. For example in the above case it would be 8:46:59 to 8:48:55. Is there an oracle query to extract that longest set of data from the large table?
Advertisement
Answer
There is a trick using the difference of row_number() values that you can use to identify sequences:
select value, count(*) as sequence_length, min(timestamp), max(timestamp)
from (select t.*,
(row_number() over (order by timestamp) -
row_number() over (partition by value order by timestamp)
) as seqnum
from t
) t
where value = 'C'
group by seqnum, value
order by max(timestamp) - min(timestamp) desc;
To get just one row, you can use fetch first 1 row only in Oracle 12c+. In earlier versions, you can use:
select t.*
from (<subquery>
order by . . .
) t
where rownum = 1;