agentNo(编号,主键) age(年龄) name(名字) gender(性别)
现在我要做这样的查询:
按年龄分组,每一个分组里面的第一个人的所有信息
分组里面数据的顺序是order by name desc
select a.*
from agent a,
(select max(agentNo) as agentNo from agent group by age) b
where a.agentNo = b.agentNo
这个是查询每一个分组里面编号最大的人的所有信息 但是后来发现不应该这样做,而是要
“每一个分组里面的第一个人的所有信息”
我现在想到一个方法,先把agent order by age,name desc 然后再把查询结果用group by 分组
但是后面那种想法有不明白的地方了,我先排好序,再group by 一分组,估计之前的顺序又打乱了,总之这写法蛋疼
我想问问有没有一步到位,不需要子查询的写法?
17 个解决方案
#1
不用子查询估计不行。
参考下贴中的多种方法,不是DB2的,可以借鉴一下思路。
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
参考下贴中的多种方法,不是DB2的,可以借鉴一下思路。
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
#2
按年龄分组,每一个分组里面的第一个人的所有信息
举例说明要求,贴数据,是分组后第一个人?
举例说明要求,贴数据,是分组后第一个人?
#3
select a.*
from agent a,
(select (这里要查询出agentNo字段) as agentNo from agent group by age (这里用having限制name必须取最大值)) b
where a.agentNo = b.agentNo
我想改一下用这样的思路,但是语法有错,不知道咋写了。
2楼的帖子我正在看
from agent a,
(select (这里要查询出agentNo字段) as agentNo from agent group by age (这里用having限制name必须取最大值)) b
where a.agentNo = b.agentNo
我想改一下用这样的思路,但是语法有错,不知道咋写了。
2楼的帖子我正在看
#4
select * from tt a where not exists(select 1 from tt wehre a.age=age and a.agentNo<agentNo)
#5
比如有这几个人 A 20岁,B 20岁,C 30岁, D 30岁
先按年龄分组 会分成两组 AB 和 CD
分组后取第一人(也就是名字最大的那人)第一组取B,第二组取D; 然后查出这两个人的所有信息。
#6
select * from tt a where not exists(select 1 from tt wehre a.age=age and a.name<name)
用agentNo好一些
用agentNo好一些
#7
4楼的可以查出来但是执行太慢了我看了一下至少3分钟以上了,表里面数据挺多的
#8
在AGE、agentNo上建立复合索引
#9
这个表是个备份表,插入操作也很频繁的,age、name已经有索引,agentNo是主键
#10
没办法,要提高速度,就要建立索引, AGE、NAME上建立复合索引
OR
AGE、agentNo上建立复合索引
OR
AGE、agentNo上建立复合索引
#11
不如大家帮忙看看我三楼的思路有没有救?
#12
没有,HAVING速度更慢,同样要建立索引
#13
但是这样不需要建立复合索引吧,而且这几个字段都已经有索引了。
数据的数量注定了是不能用exists的。
#14
如果你一定要用3楼的代码
select a.*
from agent a,
(
select a.* from agent a inner join
(select age,max(name)as ma from agent group by age ) b
on a.age=b.age and a.name=b.ma) c
where a.agentNo = c.agentNo
select a.*
from agent a,
(
select a.* from agent a inner join
(select age,max(name)as ma from agent group by age ) b
on a.age=b.age and a.name=b.ma) c
where a.agentNo = c.agentNo
#15
or
select a.*
from agent a,
(select agentNo as agentNo from agent c where
name=(select max(name) from agent where c.age=age)
) b
where a.agentNo = b.agentNo
select a.*
from agent a,
(select agentNo as agentNo from agent c where
name=(select max(name) from agent where c.age=age)
) b
where a.agentNo = b.agentNo
#16
wwwwb 兄弟 辛苦了
#17
在2W多条数据的表里面测试了
14楼的查询只用了1秒多一点,15楼要好几分钟。
14楼的查询只用了1秒多一点,15楼要好几分钟。
#1
不用子查询估计不行。
参考下贴中的多种方法,不是DB2的,可以借鉴一下思路。
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
参考下贴中的多种方法,不是DB2的,可以借鉴一下思路。
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
#2
按年龄分组,每一个分组里面的第一个人的所有信息
举例说明要求,贴数据,是分组后第一个人?
举例说明要求,贴数据,是分组后第一个人?
#3
select a.*
from agent a,
(select (这里要查询出agentNo字段) as agentNo from agent group by age (这里用having限制name必须取最大值)) b
where a.agentNo = b.agentNo
我想改一下用这样的思路,但是语法有错,不知道咋写了。
2楼的帖子我正在看
from agent a,
(select (这里要查询出agentNo字段) as agentNo from agent group by age (这里用having限制name必须取最大值)) b
where a.agentNo = b.agentNo
我想改一下用这样的思路,但是语法有错,不知道咋写了。
2楼的帖子我正在看
#4
select * from tt a where not exists(select 1 from tt wehre a.age=age and a.agentNo<agentNo)
#5
比如有这几个人 A 20岁,B 20岁,C 30岁, D 30岁
先按年龄分组 会分成两组 AB 和 CD
分组后取第一人(也就是名字最大的那人)第一组取B,第二组取D; 然后查出这两个人的所有信息。
#6
select * from tt a where not exists(select 1 from tt wehre a.age=age and a.name<name)
用agentNo好一些
用agentNo好一些
#7
4楼的可以查出来但是执行太慢了我看了一下至少3分钟以上了,表里面数据挺多的
#8
在AGE、agentNo上建立复合索引
#9
这个表是个备份表,插入操作也很频繁的,age、name已经有索引,agentNo是主键
#10
没办法,要提高速度,就要建立索引, AGE、NAME上建立复合索引
OR
AGE、agentNo上建立复合索引
OR
AGE、agentNo上建立复合索引
#11
不如大家帮忙看看我三楼的思路有没有救?
#12
没有,HAVING速度更慢,同样要建立索引
#13
但是这样不需要建立复合索引吧,而且这几个字段都已经有索引了。
数据的数量注定了是不能用exists的。
#14
如果你一定要用3楼的代码
select a.*
from agent a,
(
select a.* from agent a inner join
(select age,max(name)as ma from agent group by age ) b
on a.age=b.age and a.name=b.ma) c
where a.agentNo = c.agentNo
select a.*
from agent a,
(
select a.* from agent a inner join
(select age,max(name)as ma from agent group by age ) b
on a.age=b.age and a.name=b.ma) c
where a.agentNo = c.agentNo
#15
or
select a.*
from agent a,
(select agentNo as agentNo from agent c where
name=(select max(name) from agent where c.age=age)
) b
where a.agentNo = b.agentNo
select a.*
from agent a,
(select agentNo as agentNo from agent c where
name=(select max(name) from agent where c.age=age)
) b
where a.agentNo = b.agentNo
#16
wwwwb 兄弟 辛苦了
#17
在2W多条数据的表里面测试了
14楼的查询只用了1秒多一点,15楼要好几分钟。
14楼的查询只用了1秒多一点,15楼要好几分钟。