работал как шарм!
я есть такая таблица, где, предположим, для примера,NAME
это уникальный идентификатор.
NAME AGE VALUE
Jack Under 65 3
Jack 66-74 5
John 66-74 7
John Over 75 9
Gill 25-35 11
НесколькоNAME
у них более одногоAGE
, что нежелательно, так как это связано с загрязненностью данных.
Моя цель - обновить дубликаты только для того, чтобыAGE
в каждомNAME
, Таким образом, желаемый результат:
NAME AGE VALUE
Jack Under 65 3
Jack Under 65 5
John 66-74 7
John 66-74 9
Gill 25-35 11
Что-то вроде этого оператора UPDATE должно работать, но это не так.
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
Второй выпуск
Даже если я получу вышеприведенное утверждение, есть вторая проблема. Идея в том, чтобы использоватьMAX
(или жеMIN
) функция на строках, чтобы установить одинаковое значение для всех повторов в группе.
Но, к сожалению, это тоже не совсем работает, как хотелось бы. Для согласованности, в идеале, возрастом будет по умолчанию самая низкая возрастная группа. Но потому чтоMAX/MIN
сравните алфавитный порядок на строках, это дало бы, например:
Есть только четыре возрастные группы, можно ли будет указать индивидуальный заказ?
NB1: Я использую Oracle SQL.NB2: Я не против, если есть способ достичь результата, используя SELECT вместо оператора UPDATE.Воспроизводимый пример
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