Вот упрощенный пример моей проблемы. У меня есть таблица, где есть столбец «Имя» с повторяющимися записями:
ID Name
--- ----
1 AAA
2 AAA
3 AAA
4 BBB
5 CCC
6 CCC
7 DDD
8 DDD
9 DDD
10 DDD
Выполнение GROUP BY как SELECT Name, COUNT(*) AS [Count] FROM Table GROUP BY Name
приводит к следующему:
Name Count
---- -----
AAA 3
BBB 1
CCC 2
DDD 4
Меня интересуют только дубликаты, поэтому я добавлю предложение HAVING, SELECT Name, COUNT(*) AS [Count] FROM Table GROUP BY Name HAVING COUNT(*) > 1
:
Name Count
---- -----
AAA 3
CCC 2
DDD 4
Пока банально, но теперь все становится сложнее: мне нужен запрос, чтобы получить все дублирующиеся записи, но с хорошим индикатором увеличения, добавленным в столбец Имя. Результат должен выглядеть примерно так:
ID Name
--- --------
1 AAA
2 AAA (2)
3 AAA (3)
5 CCC
6 CCC (2)
7 DDD
8 DDD (2)
9 DDD (3)
10 DDD (4)
Примечание: строка 4 с надписью «BBB» исключена, а первый дубликат сохраняет исходное имя.
Использование оператора EXISTS
дает мне все записи, которые мне нужны, но как мне создать новое значение имени?
SELECT * FROM Table AS T1
WHERE EXISTS (
SELECT Name, COUNT(*) AS [Count]
FROM Table
GROUP BY Name
HAVING (COUNT(*) > 1) AND (Name = T1.Name))
ORDER BY Name
Мне нужно создать инструкцию UPDATE, которая исправит все дубликаты, т.е. изменит имя в соответствии с этим шаблоном.
Обновление:
Разобрался сейчас. Это был пункт PARTITION BY , который я пропустил.