oracle数据库,多条数据中有一个字段(name)有重复记录,但是其他字段不重复,怎么才能去重查询.

例如:
ID NAME AGE
1 tom 22
2 tom 23
3 tom 24
4 lily 22
5 lily 23

我希望查询之后的结果为:
ID NAME AGE
3 tom 24
5 lily 23
求大神们帮助下
select * from TABLE where ID in(select max(t.ID) from TABLE t group by t.NAME)
大概就是这样吧

CREATE TABLE #test (
  ID    int,
  name  varchar(10),
  age   int
);
go


-- 用于测试 楼主的原始数据.
INSERT INTO #test
SELECT  1, 'tom',    22    UNION ALL
SELECT  2, 'tom',    23    UNION ALL
SELECT  3, 'tom',    24    UNION ALL
SELECT  4, 'lily',   22    UNION ALL
SELECT  5, 'lily',   23;

-- 用于测试 年龄不是按照大小顺序
INSERT INTO #test
SELECT  101, '张三',    23    UNION ALL
SELECT  102, '张三',    22    UNION ALL
SELECT  103, '张三',    21;

GO


-- 楼主的SQL
select * from #test where ID in(select max(t.ID) from #test t group by t.NAME)
GO

ID          name       age
----------- ---------- -----------
          3 tom                 24
          5 lily                23
        103 张三                  21

(3 行受影响)




-- 方法1:
SELECT
  *
FROM
  #test main
WHERE
  NOT EXISTS( select 1 FROM #test sub where main.name=sub.name AND main.age<sub.age);
GO

ID          name       age
----------- ---------- -----------
          3 tom                 24
          5 lily                23
        101 张三                  23

(3 行受影响)


-- 方法2:
select * from #test 
where  name + '.' + CAST(age as char) IN (SELECT name + '.' + CAST(MAX(age) as char) FROM #test GROUP by name);
GO

ID          name       age
----------- ---------- -----------
          3 tom                 24
          5 lily                23
        101 张三                  23

(3 行受影响)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-31

distinct去重复数据用

select id,distinct(name),age from table

参考http://baike.baidu.com/view/995053.htm

第2个回答  2013-05-31
楼下的回答很幼稚 测试了吗?
我帮你写下 把表名换一下就可以了
select max(ID) ID, name,max(age) age from tbname
group by name

为什么把问题搞的那么复杂 就这么简单的事情 写的越多越好吗?
楼主的那个方法也可以 (应该是巧合 如果你的年龄不是按照大小顺序的 你那个结果查询的就不是你要的)
第3个回答  2013-05-31
select id, name, max(age)
from table
group by name

很久不写SQL,语法都忘了。。。
GROUP BY 只能取两个字段,ID应该是主键吧?
如果是ORACLE 可以用ROW_NUMBER试试。
select * from (select ID ,NAME ,AGE,row_number() over(partition by NAME order by ID,AGE DESC) rn from TABLE ) where rn=1
我这没环境,要是有什么幼稚的错误自己改改吧,思路应该是这样。

你的追问是名字分组取出最大的ID,因为是唯一主键所以写的没错。如果你想把年龄作为条件加进去你的写法就有问题了。
第4个回答  2013-05-31
SELECT MAX(A.ID),A.NAME,B.MAG
FROM TABLE A,
(SELECT NAME,MAX(AGE) MAG FROM TABLE GROUP BY NAME) B
WHERE
A.NAME=B.NAME
GROUP BY A.NAME,B.MAG
你试下
相似回答