Não há nada de inesperado nesse resultado, exceto talvez se você não o entender.
Cada CTE é resolvido
each and every time
é referenciado. Sim, é por isso que é possível que um CTE simples em uma tabela altamente transacional retorne 4 linhas em uma referência e 5 linhas nos próximos 2 níveis abaixo. No seu exemplo, no entanto, é por causa do ORDER BY NEWID(), dando a cada resolução do CTE original um row_number()-ing diferente. Você achou que os CTEs são armazenados na memória e armazenados em cache? No site SQLFiddle, em seus resultados, há um link "exibir plano de execução". Ele mostra 2 verificações distintas e separadas da tabela .