I get a different set of results for this query intermittently when I run it ... sometimes it gives 1363, sometimes 1365, and sometimes 1366. The data does not change. What could be causing this and is there a way to prevent this? The query looks something like this:
SELECT * FROM ( SELECT RC.UserGroupId, RC.UserGroup, RC.ClientId AS CLID, CASE WHEN T1.MultipleClients = 1 THEN RC.Salutation1 ELSE RC.DisplayName1 END AS szDisplayName, T1.MultipleClients, RC.IsPrimaryRecord, RC.RecordTypeId, RC.ClientTypeId, RC.ClientType, RC.IsDeleted, RC.IsCompany, RC.KnownAs, RC.Salutation1, RC.FirstName, RC.Surname, Relationship, C.DisplayName Client, RC.DisplayName RelatedClient, E.Email, RC.DisplayName + ' is the ' + R.Relationship + ' of ' + C.DisplayName Description, ROW_NUMBER() OVER (PARTITION BY E.Email ORDER BY Relationship DESC) AS sequence_id FROM SSDS.Client.ClientExtended C INNER JOIN SSDS.Client.ClientRelationship R WITH (NOLOCK)ON C.ClientId = R.ClientID INNER JOIN SSDS.Client.ClientExtended RC WITH (NOLOCK)ON R.RelatedClientId = RC.ClientId LEFT OUTER JOIN SSDS.Client.Email E WITH (NOLOCK)ON RC.ClientId = E.ClientId LEFT OUTER JOIN SSDS.Client.UserDefinedData UD WITH (NOLOCK)ON C.ClientId = UD.ClientId AND C.UserGroupId = UD.UserGroupId INNER JOIN ( SELECT E.Email, CASE WHEN (COUNT(DISTINCT RC.DisplayName) > 1) THEN 1 ELSE 0 END AS MultipleClients FROM SSDS.Client.ClientExtended C INNER JOIN SSDS.Client.ClientRelationship R WITH (NOLOCK)ON C.ClientId = R.ClientID INNER JOIN SSDS.Client.ClientExtended RC WITH (NOLOCK)ON R.RelatedClientId = RC.ClientId LEFT OUTER JOIN SSDS.Client.Email E WITH (NOLOCK)ON RC.ClientId = E.ClientId LEFT OUTER JOIN SSDS.Client.UserDefinedData UD WITH (NOLOCK)ON C.ClientId = UD.ClientId AND C.UserGroupId = UD.UserGroupId WHERE Relationship IN ('z-Group Principle', 'z-Group Member ') AND E.Email IS NOT NULL GROUP BY E.Email ) T1 ON E.Email = T1.Email WHERE Relationship IN ('z-Group Principle', 'z-Group Member ') AND E.Email IS NOT NULL ) T WHERE sequence_id = 1 AND T.UserGroupId IN (Select * from iCentral.dbo.GetSubUserGroups('471b9cbd-2312-4a8a-bb20-35ea53d30340',0)) AND T.IsDeleted = 0 AND T.RecordTypeId = 1 AND T.ClientTypeId IN ( '1',
EDIT:
I deleted all NOLOCK (including those in the views and UDF) and I still have the same problem. I get the same results every time for a nested select (T), and if I put the result set T in a temporary table at the beginning of the query and join the temp table instead of the nested select, then the final result set is the same every time I run the query.
EDIT2:
I read another ROW_NUMBER () ... I split by email (of which there are duplicates) and sorted by Relationship (where there is only 1 of 2 relationships). Can this make the request non-deterministic and can it be fixed?
EDIT3:
Here are real execution plans if anyone is interested in http://www.mediafire.com/?qo5gkh5dftxf0ml . Is it possible to see that it works as read from the execution plan? I compared files using WinMerge, and the only differences seem to be the counts (ActualRows = "").
EDIT4:
It works:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY B.Email ORDER BY Relationship DESC) AS sequence_id FROM ( SELECT DISTINCT RC.UserGroupId, ... ) B...
EDIT5:
When I execute the same query ROW_NUMBER () (T in the original question, just selecting RC.DisplayName and ROW_NUMBER) two times in a row I get different ranks for some people:

Does anyone have a good explanation / example of why and how ROW_NUMBER () on a result set that contains duplicates can be evaluated differently each time it is executed, and ultimately change the number of results?
EDIT6:
OK, I think that makes sense to me now. This happens when 2 people have the same email address (for example, a couple of husband and wife) and relationship. I think in this case their rating ROW_NUMBER () is arbitrary and can change every time it starts.