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.ageGO
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 行受影响)
distinct去重复数据用
select id,distinct(name),age from table
参考http://baike.baidu.com/view/995053.htm
楼下的回答很幼稚 测试了吗?
我帮你写下 把表名换一下就可以了
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,因为是唯一主键所以写的没错。如果你想把年龄作为条件加进去你的写法就有问题了。
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
你试下