假如又如下的表A.name age address
----------------
aa1 10 asas
aa1 20 asasas
aaa1 50 dsd
bb1 10 asads
bb1 30 asasdas
... .. ........name相同的数据都为2条,也有name唯一的数据。
现在希望通过SQL语句实现
将名字相同的记录中age较大一条的age赋给age较小的,然后删除修改之前age较大的那条记录。
如:
之前:
aa1 10 asas
aa1 20 asasas之后:
aa1 20 asas其他名字相同记录相同处理.
谢谢.
----------------
aa1 10 asas
aa1 20 asasas
aaa1 50 dsd
bb1 10 asads
bb1 30 asasdas
... .. ........name相同的数据都为2条,也有name唯一的数据。
现在希望通过SQL语句实现
将名字相同的记录中age较大一条的age赋给age较小的,然后删除修改之前age较大的那条记录。
如:
之前:
aa1 10 asas
aa1 20 asasas之后:
aa1 20 asas其他名字相同记录相同处理.
谢谢.
row_number() over(partition by name order by age desc)
这样后面就会有个排序号了,
取排序号为2的 age 赋值给排序号为1的age且名字相同
最后删除排序号为2的记录就可以了
然后update 编号为1 的age 为编号为2的内容
然后删除编号为2的
最后可以把这个字段删除
create tablename1 as select name,age,address from tablename where (name,age) in (select name ,max(age) from tablename group by name having count(*)>1);
--更新age
update tablename a set age=(select age from tablename1 where name=a.name )
where name in (select name from tablename1);
--删除多余数据
delete tablename where (name,age,address) in (select name,age,address from tablename1);
--删除临时表
drop table tablename1;
UPDATE (SELECT /*+BYPASS_UJVC*/
T1.AGE,
J1.MAX_AGE
FROM TEST T1,
(SELECT T1.NAME,
MIN(T1.AGE) AS MIN_AGE,
MAX(T1.AGE) AS MAX_AGE
FROM TEST T1
GROUP BY T1.NAME) J1
WHERE T1.NAME = J1.NAME)
SET AGE = MAX_AGE
利用这个更新语句,把数据更新后再delete掉没有用的就可以了.
注:其中的TEST表是作为测试表,楼主根据实际表的名称更改一下SQL就可以了.