Попробуйте:
SET NOCOUNT ON
DECLARE @Emails table (PersonID int, EmailID int, Active bit)
INSERT @Emails VALUES ( 1,1,0)
INSERT @Emails VALUES ( 1,2,0)
INSERT @Emails VALUES ( 1,3,1)
INSERT @Emails VALUES ( 1,4,0)
INSERT @Emails VALUES ( 1,5,1)
INSERT @Emails VALUES ( 1,6,0)
INSERT @Emails VALUES ( 1,7,0)
INSERT @Emails VALUES ( 1,8,0)
INSERT @Emails VALUES ( 1,9,0)
INSERT @Emails VALUES ( 2,1,0)
INSERT @Emails VALUES ( 2,2,0)
INSERT @Emails VALUES ( 2,3,0)
INSERT @Emails VALUES ( 2,4,0)
INSERT @Emails VALUES ( 2,5,0)
INSERT @Emails VALUES ( 2,6,0)
INSERT @Emails VALUES ( 3,1,1)
INSERT @Emails VALUES ( 3,2,1)
INSERT @Emails VALUES ( 3,3,1)
INSERT @Emails VALUES ( 3,4,1)
SET NOCOUNT OFF
SELECT
e.PersonID,COUNT(e.EmailID) AS CountInactive
FROM @Emails e
LEFT OUTER JOIN (SELECT
PersonID,MAX(EmailID) AS LastActive
FROM @Emails
WHERE Active=1
GROUP BY PersonID
) dt ON e.PersonID=dt.PersonID
WHERE e.EmailID>ISNULL(dt.LastActive,0)
GROUP BY e.PersonID
ВЫХОД:
PersonID CountInactive
----------- -------------
1 4
2 6
(2 row(s) affected)
РЕДАКТИРОВАТЬ после редактирования ОП, тот же вывод, что и выше:
SELECT
e.PersonID,COUNT(e.EmailID) AS CountInactive
FROM @Emails e
LEFT OUTER JOIN (SELECT
PersonID,MAX(EmailDate) AS LastActive
FROM @Emails
WHERE Active=1
GROUP BY PersonID
) dt ON e.PersonID=dt.PersonID
WHERE (e.EmailDate>ISNULL(dt.LastActive,0)) OR dt.PersonID IS NULL
GROUP BY e.PersonID