Не уверен, что вижу здесь проблему. Сначала материализуйте подзапрос T1:
SELECT num, ROW_NUMBER() OVER (ORDER BY num)
FROM @a
GROUP BY num;
Вы получите две строки:
dan 1
fran 2
Теперь присоединитесь к a on num = num, и вы получите 4 строки, 2 для каждого отдельного значения. Какова ваша настоящая цель здесь? Возможно, вам следует применять ROW_NUMBER () снаружи?
Порядок материализации зависит от оптимизатора. Вы обнаружите, что другие встроенные модули (RAND (), GETDATE () и т. Д.) Имеют аналогично несовместимое поведение материализации. Мало что вы можете с этим поделать, и мало шансов, что они это "исправят".
EDIT
Новый пример кода. Запишите содержимое @a в таблицу #temp, чтобы «материализовать» назначение NEWID () для каждого уникального значения num.
SELECT num, id = NEWID()
INTO #foo FROM @a GROUP BY num;
SELECT a.num, f.id
FROM @a AS a
INNER JOIN #foo AS f
ON a.num = f.num;
DROP TABLE #foo;