oracle数据库,多条数据中有一个字段(name)有重复记录,但是其他字段不重复,怎么才能去重查询.
例如:IDNAMEAGE1tom222tom233tom244lily225lily23我希望查询之后的结果为:IDNAMEAGE3tom245lily23求大神们帮助下...
例如:
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)
大概就是这样吧 展开
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)
大概就是这样吧 展开
7个回答
2013-05-31
展开全部
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 行受影响)
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼下的回答很幼稚 测试了吗?
我帮你写下 把表名换一下就可以了
select max(ID) ID, name,max(age) age from tbname
group by name
为什么把问题搞的那么复杂 就这么简单的事情 写的越多越好吗?
楼主的那个方法也可以 (应该是巧合 如果你的年龄不是按照大小顺序的 你那个结果查询的就不是你要的)
我帮你写下 把表名换一下就可以了
select max(ID) ID, name,max(age) age from tbname
group by name
为什么把问题搞的那么复杂 就这么简单的事情 写的越多越好吗?
楼主的那个方法也可以 (应该是巧合 如果你的年龄不是按照大小顺序的 你那个结果查询的就不是你要的)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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,因为是唯一主键所以写的没错。如果你想把年龄作为条件加进去你的写法就有问题了。
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,因为是唯一主键所以写的没错。如果你想把年龄作为条件加进去你的写法就有问题了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
你试下
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
你试下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询