我有一张这样的桌子,假设为了举例,NAME
是一个唯一的标识符。
NAME AGE VALUE
Jack Under 65 3
Jack 66-74 5
John 66-74 7
John Over 75 9
Gill 25-35 11
Some NAME
s 有多个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
(or MIN
) 作用于字符串,为组内的所有重复设置相同的值。
但不幸的是,这也无法完全按照预期工作。为了保持一致性,理想情况下年龄将默认为最低年龄组。但是因为MAX/MIN
比较字符串的字母顺序,这会给出,例如:
- “66-74”和“65 岁以下”=> MAX=“65 岁以下”-- 最低
- "66-74" 和 "超过 75" => MAX="超过 75" -- 最高
只有四个年龄组,可以指定自定义顺序吗?
-
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