• This is what I came out with.

    No idea if it will perform well. So many iterations and changes as I got to understand the intracacies of your requirement.

    I suspect it will be better as it removes redundant distincts and has less windowing, but I'm still grouping a lot so who knows?

    ;WITH CTE_PROD AS (

    SELECT

    ROW_NUMBER() OVER (PARTITION BY MASTERID ORDER BY RECORDDATE ASC) rownum,

    CASE WHEN HOURSFLOWED >= 18 THEN 1 ELSE 0 END IncludeCurrent

    ,MasterID,recorddate

    FROM PROD A

    ),

    gaps AS (

    SELECT

    rownum,

    MASTERID

    FROM CTE_PROD

    WHERE IncludeCurrent = 0

    ),

    nearestgapbelow AS (

    SELECT

    c.rownum,

    c.MASTERID,

    C.RECORDDATE,

    COALESCE(MAX(g.rownum),0) closestGap

    FROM CTE_PROD c

    LEFT JOIN gaps g

    ON c.MASTERID = g.MASTERID

    AND c.rownum > g.rownum

    WHERE c.IncludeCurrent = 1

    GROUP BY c.rownum,c.MASTERID,c.RECORDDATE

    ),

    islands AS (

    SELECT c.rownum,c.MasterID, c.RECORDDATE ceilingDate,f.RECORDDATE floorDate, DATEDIFF(day,f.recorddate,c.recorddate)+1 DayRange

    FROM nearestgapbelow c

    JOIN nearestgapbelow f

    ON c.MASTERID=f.MASTERID

    AND c.rownum = f.rownum + 6

    AND c.closestGap = f.closestGap

    ),

    closestisland AS (

    SELECT

    d.MASTERID,

    d.RECORDDATE,

    MAX(i.rownum) rownum

    FROM DOWN d

    LEFT JOIN islands i

    ON d.MASTERID = i.MASTERID

    AND d.RECORDDATE > i.ceilingDate

    GROUP BY d.MASTERID, d.RECORDDATE

    )

    SELECT

    ci.MASTERID,

    ci.RECORDDATE,

    i.floorDate,

    i.CeilingDate,

    i.DayRange,

    AVG(p.HOURSFLOWED) AVG_FLOW_HOURS,

    SUM(p.HOURSFLOWED) SUM_FLOW_HOURS

    FROM closestisland ci

    LEFT JOIN islands i

    ON ci.MASTERID = i.MASTERID

    AND ci.rownum = i.rownum

    LEFT JOIN PROD p

    ON i.MASTERID = p.MASTERID

    AND p.RECORDDATE BETWEEN i.floorDate AND i.ceilingDate

    GROUP BY ci.MASTERID,ci.RECORDDATE,i.floorDate,i.ceilingDate,i.DayRange

    ORDER BY ci.MASTERID,ci.RECORDDATE DESC