Легкий Писи:
Следующий пример ранжирует каждое имя, сгруппированное по его идентификатору:
SELECT ID, Name, Rank() OVER (PARTITION BY ID ORDER BY Name ASC) as Rank
FROM Names
ORDER BY Name ASC
В следующем примере ранжируются все имена, сгруппированные по их идентификатору, но пропускаются записи, в которых значение Client равно нулю:
SELECT ID, Name, Client, Rank() OVER (PARTITION BY ID ORDER BY Name ASC) as Rank
FROM Names
WHERE Client IS NOT NULL
И, наконец, следующий пример использует результаты предыдущего примера для обновления таблицы соответствующими рангами:
UPDATE Names
SET Rank = ranks.rank
FROM
(SELECT ID, Name, Client, Rank() OVER (PARTITION BY ID ORDER BY Name ASC) as Rank
FROM Names
WHERE Client IS NOT NULL
) ranks
WHERE Names.Name = ranks.Name
В последнем примере, если Имя не уникально, вы, скорее всего, захотите изменить предложение WHERE, чтобы оно совпадало с уникальным идентификатором.
Некоторая достаточно понятная документация здесь: http://msdn.microsoft.com/en-us/library/ms176102.aspx
Удачи!