查询group分组内第一条数据的问题

时间:2021-01-10 00:26:19
假设有个人员表 :
    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条记录方法征集,及散分....

#2


 按年龄分组,每一个分组里面的第一个人的所有信息  

举例说明要求,贴数据,是分组后第一个人?

#3


select a.*  
from agent a,
(select (这里要查询出agentNo字段) as agentNo from agent group by age (这里用having限制name必须取最大值)) b
where a.agentNo = b.agentNo

我想改一下用这样的思路,但是语法有错,不知道咋写了。 查询group分组内第一条数据的问题
2楼的帖子我正在看

#4


select * from tt a where not exists(select 1 from tt wehre a.age=age and a.agentNo<agentNo)

#5


引用 2 楼 wwwwb 的回复:
 按年龄分组,每一个分组里面的第一个人的所有信息  

举例说明要求,贴数据,是分组后第一个人?


比如有这几个人    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好一些

#7


4楼的可以查出来但是执行太慢了我看了一下至少3分钟以上了,表里面数据挺多的

#8


引用 7 楼 left_you 的回复:
4楼的可以查出来但是执行太慢了我看了一下至少3分钟以上了,表里面数据挺多的

在AGE、agentNo上建立复合索引

#9


这个表是个备份表,插入操作也很频繁的,age、name已经有索引,agentNo是主键

#10


没办法,要提高速度,就要建立索引, AGE、NAME上建立复合索引
OR
AGE、agentNo上建立复合索引

#11


查询group分组内第一条数据的问题
不如大家帮忙看看我三楼的思路有没有救?

#12


引用 11 楼 left_you 的回复:
不如大家帮忙看看我三楼的思路有没有救?

没有,HAVING速度更慢,同样要建立索引

#13


引用 12 楼 wwwwb 的回复:
引用 11 楼 left_you 的回复:
不如大家帮忙看看我三楼的思路有没有救?

没有,HAVING速度更慢,同样要建立索引


但是这样不需要建立复合索引吧,而且这几个字段都已经有索引了。
数据的数量注定了是不能用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

#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

#16


wwwwb 兄弟 辛苦了 查询group分组内第一条数据的问题

#17


在2W多条数据的表里面测试了 
14楼的查询只用了1秒多一点,15楼要好几分钟。

#1


不用子查询估计不行。

参考下贴中的多种方法,不是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

我想改一下用这样的思路,但是语法有错,不知道咋写了。 查询group分组内第一条数据的问题
2楼的帖子我正在看

#4


select * from tt a where not exists(select 1 from tt wehre a.age=age and a.agentNo<agentNo)

#5


引用 2 楼 wwwwb 的回复:
 按年龄分组,每一个分组里面的第一个人的所有信息  

举例说明要求,贴数据,是分组后第一个人?


比如有这几个人    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好一些

#7


4楼的可以查出来但是执行太慢了我看了一下至少3分钟以上了,表里面数据挺多的

#8


引用 7 楼 left_you 的回复:
4楼的可以查出来但是执行太慢了我看了一下至少3分钟以上了,表里面数据挺多的

在AGE、agentNo上建立复合索引

#9


这个表是个备份表,插入操作也很频繁的,age、name已经有索引,agentNo是主键

#10


没办法,要提高速度,就要建立索引, AGE、NAME上建立复合索引
OR
AGE、agentNo上建立复合索引

#11


查询group分组内第一条数据的问题
不如大家帮忙看看我三楼的思路有没有救?

#12


引用 11 楼 left_you 的回复:
不如大家帮忙看看我三楼的思路有没有救?

没有,HAVING速度更慢,同样要建立索引

#13


引用 12 楼 wwwwb 的回复:
引用 11 楼 left_you 的回复:
不如大家帮忙看看我三楼的思路有没有救?

没有,HAVING速度更慢,同样要建立索引


但是这样不需要建立复合索引吧,而且这几个字段都已经有索引了。
数据的数量注定了是不能用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

#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

#16


wwwwb 兄弟 辛苦了 查询group分组内第一条数据的问题

#17


在2W多条数据的表里面测试了 
14楼的查询只用了1秒多一点,15楼要好几分钟。