Oracle查询分组数据中每个分组的前5条记录(用一条sql实现)

时间:2021-12-31 23:25:10
例如 表zoon中的animal字段里有“tiger”,“monkey”,“elenphant”等等200多种,我需要查出每种动物的各5条记录
结果显示为:
animal age id
tiger  10  1
tiger  11  2
..
monkey 10 12
monkey 10 13
...
elephant 10 20
elephant 11 21
..
等等200多种都各显示5条

请问要如何实现

7 个解决方案

#1


select animal,age,id,total from(
select animal,age,id,row_number() over(partition by animal order by id) total from zoon
) rn <= 5


没有验证,思路是这样

#2


select * from
(
select animal,age,id ,row_number()over(partition by animal order by age desc) row_num
from zoon
)where row_num <=5;

显示出了每种动物中年龄最大的前5种animal。

#3


1楼领先了!来迟一步!

#4


首先强烈建议你不要试图用1个sql干这件事。

因为sql返回肯定是一个list
后续还要遍历list把他们按照类型拆分

sql的话呢 就是select * from zoon where animal='xxx1' union select * from zoon where animal='xxx2' union 。。。
这个xxx要先用distinct查出来,然后拼这个大sql。


#5


速度都好快。。
楼主学习下分析函数,你会发现很强大

#6


引用 4 楼 easyroom 的回复:
首先强烈建议你不要试图用1个sql干这件事。

因为sql返回肯定是一个list
后续还要遍历list把他们按照类型拆分

sql的话呢 就是select * from zoon where animal='xxx1' union select * from zoon where animal='xxx2' union 。。。
这个xxx要先用distinct查出来,然后拼这个大sql……


疑惑中。。。。

#7


最近有点事不在,不好意思啊,谢谢1楼的答案

#1


select animal,age,id,total from(
select animal,age,id,row_number() over(partition by animal order by id) total from zoon
) rn <= 5


没有验证,思路是这样

#2


select * from
(
select animal,age,id ,row_number()over(partition by animal order by age desc) row_num
from zoon
)where row_num <=5;

显示出了每种动物中年龄最大的前5种animal。

#3


1楼领先了!来迟一步!

#4


首先强烈建议你不要试图用1个sql干这件事。

因为sql返回肯定是一个list
后续还要遍历list把他们按照类型拆分

sql的话呢 就是select * from zoon where animal='xxx1' union select * from zoon where animal='xxx2' union 。。。
这个xxx要先用distinct查出来,然后拼这个大sql。


#5


速度都好快。。
楼主学习下分析函数,你会发现很强大

#6


引用 4 楼 easyroom 的回复:
首先强烈建议你不要试图用1个sql干这件事。

因为sql返回肯定是一个list
后续还要遍历list把他们按照类型拆分

sql的话呢 就是select * from zoon where animal='xxx1' union select * from zoon where animal='xxx2' union 。。。
这个xxx要先用distinct查出来,然后拼这个大sql……


疑惑中。。。。

#7


最近有点事不在,不好意思啊,谢谢1楼的答案