Actualice filas duplicadas solo con una función MAX en SQL
Tengo una tabla como esta, donde, por ejemplo, supongamosNAME
Es un identificador único.
NAME AGE VALUE
Jack Under 65 3
Jack 66-74 5
John 66-74 7
John Over 75 9
Gill 25-35 11
AlgunosNAME
s tiene más de unoAGE
, lo que no es deseable, ya que esto se debe a la suciedad de los datos.
Mi objetivo es actualizar los duplicados solo para tener unoAGE
Dentro de cadaNAME
. La salida deseada es así:
NAME AGE VALUE
Jack Under 65 3
Jack Under 65 5
John 66-74 7
John 66-74 9
Gill 25-35 11
Algo como esta declaración ACTUALIZACIÓN debería funcionar, pero no es así.
UPDATE table t1
SET t1.age=MAX(t1.age)
WHERE EXISTS (SELECT COUNT(t2.AGE)
FROM table t2
WHERE t1.NAME=t2.NAME
GROUP BY t2.NAME
HAVING COUNT(t2.AGE) > 1)
SQL Error: ORA-00934: group function is not allowed here
Segundo problema
Incluso si tengo la declaración anterior para trabajar, hay un segundo problema. La idea es usar elMAX
(oMIN
) funcionan en cadenas para establecer el mismo valor para todas las repeticiones dentro de un grupo.
Pero desafortunadamente, esto tampoco funcionaría como se desea. Para mantener la coherencia, lo ideal sería una edad predeterminada para el grupo de edad más bajo. Pero porqueMAX/MIN
compare el orden alfabético en las cadenas, esto daría, por ejemplo:
Solo hay cuatro grupos de edad, ¿sería posible especificar un pedido personalizado?
NB1: Estoy usando Oracle SQL.NB2: No me importa si hay una manera de lograr el resultado utilizando una instrucción SELECT en lugar de una ACTUALIZACIÓN.Ejemplo reproducible
SELECT 'Jack' as NAME, 'Under 65' as AGE, 3 as VALUE from dual
UNION ALL
SELECT 'Jack' as NAME, '66-74' as AGE, 5 as VALUE from dual
UNION ALL
SELECT 'John' as NAME, '66-74' as AGE, 7 as VALUE from dual
UNION ALL
SELECT 'John' as NAME, 'Over 75' as AGE, 9 as VALUE from dual
UNION ALL
SELECT 'Gill' as NAME, '25-35' as AGE, 11 as VALUE from dual