You need to identify groups of consecutive days, where oos = 1 or 0. This can be done using the LAG function to find when the oos column changes and then sums it up.
with x (s_date,qty,oos,chg) as ( select s_date,qty,oos, case when oos = lag(oos,1) over (order by s_date) then 0 else 1 end from stk ) select s_date,qty,oos, sum(chg) over (order by s_date) grp from x;
output:
| S_DATE | QTY | OOS | GRP | |--------------------------------|-----|-----|-----| | January, 01 2013 00:00:00+0000 | 0 | 1 | 1 | | January, 02 2013 00:00:00+0000 | 0 | 1 | 1 | | January, 03 2013 00:00:00+0000 | 0 | 1 | 1 | | January, 04 2013 00:00:00+0000 | 5 | 0 | 2 | | January, 05 2013 00:00:00+0000 | 0 | 1 | 3 | | January, 06 2013 00:00:00+0000 | 0 | 1 | 3 |
You can then judge this oos, broken down by the grp column, to get consecutive oos days.
with x (s_date,qty,oos,chg) as ( select s_date,qty,oos, case when oos = lag(oos,1) over (order by s_date) then 0 else 1 end from stk ), y (s_date,qty,oos,grp) as ( select s_date,qty,oos, sum(chg) over (order by s_date) from x ) select s_date,qty,oos, sum(oos) over (partition by grp order by s_date) cum_days_oos from y;
output:
| S_DATE | QTY | OOS | CUM_DAYS_OOS | |--------------------------------|-----|-----|--------------| | January, 01 2013 00:00:00+0000 | 0 | 1 | 1 | | January, 02 2013 00:00:00+0000 | 0 | 1 | 2 | | January, 03 2013 00:00:00+0000 | 0 | 1 | 3 | | January, 04 2013 00:00:00+0000 | 5 | 0 | 0 | | January, 05 2013 00:00:00+0000 | 0 | 1 | 1 | | January, 06 2013 00:00:00+0000 | 0 | 1 | 2 |
Demo on sqlfiddle .