Sure, here you go:
CREATE TABLE Request
(
RequestId INT NOT NULL,
EmailAddress VARCHAR(50) NOT NULL
);
CREATE TABLE Quote
(
QuoteId INT NOT NULL,
RequestId INT NOT NULL,
CreatedAt DATETIME NOT NULL
);
INSERT INTO Request VALUES (1, 'joe@bloggs.com');
INSERT INTO Request VALUES (2, 'bob@bloggs.com');
INSERT INTO Quote VALUES (1,1,'2012-09-04 14:00');
INSERT INTO Quote VALUES (2,1,'2012-09-04 14:30');
INSERT INTO Quote VALUES (3,1,'2012-09-05 12:51');
INSERT INTO Quote VALUES (4,1,'2012-11-09 09:00');
INSERT INTO Quote VALUES (5,1,'2012-11-09 11:00');
INSERT INTO Quote VALUES (6,2,'2012-09-04 15:00');
INSERT INTO Quote VALUES (7,2,'2012-09-04 15:00');
INSERT INTO Quote VALUES (8,2,'2012-12-30 19:30');
INSERT INTO Quote VALUES (9,2,'2012-12-30 19:30');
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) AS InitialRank
FROM
Request r
INNER JOIN Quote q
ON r.RequestId = q.RequestId
ORDER BY
r.EmailAddress
,q.CreatedAt;
I've included a slightly modified query to use the created tables.