¿Hay alguna forma de obtener resultados diferentes para la misma consulta SQL si los datos permanecen iguales?

Obtengo un conjunto de resultados diferente para esta consulta de forma intermitente cuando la ejecuto ... a veces da 1363, a veces 1365 y otras 1366 resultados. Los datos no cambian. ¿Qué podría estar causando esto y hay alguna manera de prevenirlo? La consulta se parece a esto:

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',              --Client
                        '-1652203805'    --NTU                      
            )        

        AND T.CLID NOT IN
          (
            SELECT DISTINCT  
                               UDDF.CLID
            FROM
                   SLacsis_SLM.dbo.T_UserDef UD WITH (NOLOCK) 
                          INNER JOIN
                   SLacsis_SLM.dbo.T_UserDefData UDDF WITH (NOLOCK)
                   ON UD.UserDef_ID = UDDF.UserDef_ID
                          INNER JOIN
                   SLacsis_SLM.dbo.T_Client CLL WITH (NOLOCK)
                   ON CLL.CLID = UDDF.CLID AND CLL.UserGroup_CLID = UD.UserID

            WHERE 
                           UD.UserDef_ID in    
                                    (
                                    'F68F31CE-525B-4455-9D50-6DA77C66FEE5',                                    
                                    'A7CECB03-866C-4F1F-9E1A-CEB09474FE47'  
                                    )

                           AND UDDF.Data = 'NO'
           ) 


ORDER BY T.Surname

EDITAR

He eliminado todos los NOLOCK (incluidos los de vistas y UDF) y sigo teniendo el mismo problema. Obtengo los mismos resultados cada vez que selecciono anidado (T) y si pongo el conjunto de resultados de T en una tabla temporal al comienzo de la consulta y me uno a la tabla temporal en lugar de la selección anidada, entonces el conjunto de resultados final es lo mismo cada vez que ejecuto la consulta.

EDIT2:

He estado leyendo un poco más en ROW_NUMBER () ... Estoy particionando por correo electrónico (de los cuales hay duplicados) y ordenando por Relación (donde solo hay 1 de 2 relaciones). ¿Podría esto causar que la consulta no sea determinista y habría alguna forma de solucionarlo?

EDIT3:

Aquí están los planes de ejecución reales si alguien está interesadohttp: //www.mediafire.com/? qo5gkh5dftxf0ml. ¿Es posible ver que se ejecuta como lectura confirmada desde el plan de ejecución? Comparé los archivos con WinMerge y las únicas diferencias parecen ser los recuentos (ActualRows = "").

EDIT4:

Esto funciona

SELECT * FROM 
(
   SELECT *, 
             ROW_NUMBER() OVER (PARTITION BY B.Email ORDER BY Relationship DESC) AS sequence_id
             FROM
            (

                                    SELECT DISTINCT  
                                    RC.UserGroupId,
                                    ...
            ) B...

EDIT5:

Al ejecutar la misma consulta ROW_NUMBER () (T en la pregunta original, simplemente seleccionando RC.DisplayName y ROW_NUMBER) dos veces seguidas obtengo un rango diferente para algunas personas:

¿Alguien tiene una buena explicación / ejemplo de por qué o cómo ROW_NUMBER () sobre un conjunto de resultados que contiene duplicados puede clasificarse de manera diferente cada vez que se ejecuta y, en última instancia, cambiar el número de resultados?

EDIT6:

Ok, creo que esto tiene sentido para mí ahora. Esto ocurre cuando las personas 2 personas tienen la misma dirección de correo electrónico (por ejemplo, un par de marido y mujer) y una relación. Supongo que en este caso su clasificación ROW_NUMBER () es arbitraria y puede cambiar cada vez que se ejecuta.

Respuestas a la pregunta(6)

Su respuesta a la pregunta