Monday, September 5, 2011

Query to report contiguous runs of sequential numbers across rows

Suppose we have a block of data:


select 0 as n from dual
union all
select 1 as n from dual
union all
select 2 as n from dual
union all
select 3 as n from dual
union all
select 4 as n from dual
union all
select 7 as n from dual
union all
select 8 as n from dual
union all
select 10 as n from dual
union all
select 11 as n from dual
union all
select 12 as n from dual


I'd like a query output like:
first_n, last_n, count
0, 4, 5
7, 8, 2
10, 12, 3

So the first block of 5 numbers: 0,1,2,3,4 is grouped up and min/max/counted (the block has 5 numbers, first is 0 and last is 4 hence result 0,4,5).



Below query solves the problem


"select min(n), max(n), count(*) from (data_block) group by rownum-n"


First it computes "rownum-n" for all the rows in the table say (1,1,1,1,1,-1,-2,-2,-2,-2) then groups it accordingly. 


No comments:

Post a Comment