Cela devrait faire l'affaire :
SELECT X,Y,Z,ROW_NUMBER() OVER (PARTITION BY X,Y,Z ORDER BY X,Y,Z)
FROM TABLE1
Le ROW_NUMBER() cochera pour chaque valeur du groupe X, Y, Z et se réinitialisera au groupe suivant. La clause ORDER BY est utilisée pour définir dans quel ordre elle doit être cochée et peut être modifiée comme vous le souhaitez. C'est l'une des fonctions analytiques fournies par Oracle, et cela peut être très utile.