Here's another
WITH CTE AS (
SELECT
r.RequestId
,q.QuoteId
,r.EmailAddress
,q.CreatedAt
,CASE
WHEN DATEDIFF(dd,LAG(q.CreatedAt,1) OVER (PARTITION BY r.EmailAddress ORDER BY q.CreatedAt),q.CreatedAt) > 30
THEN 1
ELSE 0
END AS GroupResetFlag
,DENSE_RANK() OVER(PARTITION BY r.EmailAddress ORDER BY q.CreatedAt,q.QuoteId) AS InitialRank
FROM
Request r
INNER JOIN Quote q
ON r.RequestId = q.RequestId)
SELECT r.RequestId
,r.QuoteId
,r.EmailAddress
,r.CreatedAt
,r.GroupResetFlag
,r.InitialRank - ISNULL(ca.InitialRank-1,0) AS InitialRank
FROM CTE r
OUTER APPLY(SELECT TOP 1 * FROM CTE r2
WHERE r2.EmailAddress = r.EmailAddress
AND r2.GroupResetFlag = 1
AND r2.CreatedAt <= r.CreatedAt
ORDER BY r2.CreatedAt DESC, r2.QuoteId DESC) ca
ORDER BY
r.EmailAddress
,r.CreatedAt;
____________________________________________________
Deja View - The strange feeling that somewhere, sometime you've optimised this query before
How to get the best help on a forum
http://www.sqlservercentral.com/articles/Best+Practices/61537