; with
tbl as -- sample data
(
select col = 100, date = convert (date, '02.01.2015') union all
select col = 100, date = convert (date, '02.02.2015') union all
select col = 100, date = convert (date, '02.03.2015') union all
select col = 100, date = convert (date, '02.04.2015') union all
select col = 100, date = convert (date, '02.05.2015') union all
select col = 100, date = convert (date, '02.06.2015') union all
select col = 100, date = convert (date, '02.07.2015') union all
select col = 100, date = convert (date, '02.15.2015') union all
select col = 100, date = convert (date, '02.16.2015') union all
select col = 100, date = convert (date, '02.20.2015') union all
select col = 100, date = convert (date, '02.21.2015') union all
select col = 100, date = convert (date, '02.22.2015') union all
select col = 100, date = convert (date, '02.25.2015') union all
select col = 100, date = convert (date, '02.26.2015')
),
cte as -- assign rn for each row
(
select *,
rn = row_number() over (partition by col order by date)
from tbl
),
rcte as -- recursive CTE to identify grp and seq by grp
(
select col, date, rn, grp = 1, seq = 1
from cte
where rn = 1
union all
select c.col, c.date, c.rn,
grp = case when dateadd(day, 1, r.date) = c.date
then r.grp
else r.grp + 1
end,
seq = case when dateadd(day, 1, r.date) = c.date
then r.seq + 1
else 1
end
from rcte r
inner join cte c on r.col = c.col
and r.rn = c.rn - 1
),
cte2 as -- max seq no
(
select *, m = max(seq) over (partition by grp) / 3 * 3
from rcte
)
select col, date
from cte2
where seq <= m