;with ct as
(
SELECT
holiday_date
,grp = DATEADD(DAY ,-1 * DENSE_RANK() OVER (ORDER BY holiday_date) ,holiday_date)
FROM @t
)
select [date_from]= min(holiday_date)
, [date_to]= max(holiday_date)
from ct
group by grp
Since the day difference between two consecutive date is always 1,
-1 multiplied by day difference will create group for consecutive and non consecutive dates.
Then it is simply min and max.on group.
In my case dense_rank, rank and row_number all works.
For others, if interested, here is a query from my payroll system,
to find continuous absents or leave.
;with ct as
(
select card_code
, dt
, flag
, rn1 = row_number() over (partition by card_code order by card_code, dt)
, rn2= row_number() over (partition by card_code order by card_code, flag,dt)
, grp = row_number() over (partition by card_code order by card_code, dt)
- row_number() over (partition by card_code order by card_code, flag,dt)
from @t t
)
select ct.card_code, startDate = min(dt), endDate=max(dt), absentCount=count(*)
from ct
where ct.flag ='A' --change here with your flag
group by ct.card_code, grp
having count(*)>=@ra_absent_counts