Данные тестирования дохода:
DECLARE @User TABLE (UserId int,
UserName varchar(100), Email varchar(40), IsActivated bit)
INSERT INTO @User
SELECT 1, 'John', 'john@hotmail.com', 0 UNION
SELECT 2, 'Ann', 'ann@hotmail.com', 0 UNION
SELECT 3, 'John2', 'john@hotmail.com', 1 UNION
SELECT 4, 'Bill', 'bill@hotmail.com', 0 UNION
SELECT 5, 'Bill', 'john@hotmail.com', 0
DECLARE @Email TABLE (EmailId int,
UserId int, Date datetime, Message varchar(1000))
INSERT INTO @Email
SELECT 1, 1, GETDATE(), '' UNION
SELECT 2, 2, GETDATE(), '' UNION
SELECT 3, 3, GETDATE(), '' UNION
SELECT 4, 4, GETDATE(), '' UNION
SELECT 5, 5, GETDATE(), ''
SELECT * FROM @User
SELECT * FROM @Email
Видите ли, у нас уже был активирован john@hotmail.com, поэтому он нам не нужен в наборе результатов.
Теперь реализация с RANK OVER:
SELECT M.UserID, M.UserName, M.Email,
M.IsActivated, M.EmailId, M.Date, M.Message
FROM (
SELECT RANK() OVER (PARTITION BY U.Email
ORDER BY U.IsActivated Desc, U.UserID ASC) AS N,
U.UserID, U.UserName, U.Email, U.IsActivated,
E.EmailId, E.Date, E.Message
FROM @User U INNER JOIN @Email E ON U.UserID = E.UserID
)M WHERE M.N = 1 AND M.IsActivated = 0