Esto debería funcionar:
SELECT X,Y,Z,ROW_NUMBER() OVER (PARTITION BY X,Y,Z ORDER BY X,Y,Z)
FROM TABLE1
ROW_NUMBER() marcará cada valor en el grupo X,Y,Z y se restablecerá en el siguiente grupo. La cláusula ORDER BY se usa para definir en qué orden debe marcar, y se puede cambiar como desee. Esta es una de las funciones analíticas que proporciona Oracle, y puede ser muy útil.