Aquí hay un ejemplo simplificado de mi problema. Tengo una tabla donde hay una columna "Nombre" con entradas duplicadas:Renombrar filas duplicadas
ID Name
--- ----
1 AAA
2 AAA
3 AAA
4 BBB
5 CCC
6 CCC
7 DDD
8 DDD
9 DDD
10 DDD
Haciendo un GROUP BY como SELECT Name, COUNT(*) AS [Count] FROM Table GROUP BY Name
resultados en este:
Name Count
---- -----
AAA 3
BBB 1
CCC 2
DDD 4
Sólo estoy preocupado por los duplicados, así que 'll añadir una cláusula HAVING, SELECT Name, COUNT(*) AS [Count] FROM Table GROUP BY Name HAVING COUNT(*) > 1
:
Name Count
---- -----
AAA 3
CCC 2
DDD 4
Trivial hasta el momento, pero ahora las cosas se complican: necesito una consulta para conseguirme todos los registros duplicados, pero con un buen incrementación en dicator agregado a la columna Nombre. El resultado debe ser algo como esto:
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)
Nota fila 4 se excluye a "BBB", y el primer duplicado mantiene el nombre original.
El uso de una declaración EXISTS
me proporciona todos los registros que necesito, pero ¿cómo hago para crear el nuevo valor de Nombre?
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
Necesito crear una instrucción UPDATE que solucionará todos los duplicados, es decir, cambiar el nombre de acuerdo con este patrón.
Actualización: Lo resolvió ahora. Era la cláusula PARTITION BY que me faltaba.
Excavo los CTE. Desearía usarlos más seguido – SQLMason
Su solución se ve más ordenada, pero simplemente no puedo hacer que funcione. –
@Jakob Gade- ¿Está recibiendo un error o no está produciendo los resultados que desea? – Thomas