选择每个分组的前几条数据

ghostzitee 2010-01-05 03:51:54
有一个日志表(sys_log) 有时间(log_time)和类型(log_type)字段,其他字段忽略
我想选出 每种类型的前3条数据

不知道有什么好的SQL写法没有 (Oracle数据库)

下面是我的写法,SQL嵌套的比较多:

1.先排序生成按 log_type,log_time 排序的结果集
2.让结果集生成行号
3.选择每种类型的最小行号
4.选择每种类型行号在最小行号和最小行号+2之间的记录

select t.*
from (select t.*, rownum rn
from (select sys_log.*
from sys_log
order by log_type, log_time desc) t) t,
(select min(rn) rn, log_type
from (select t.*, rownum rn
from (select sys_log.*
from sys_log
order by log_type, log_time desc) t)
group by log_type) t2
where t.log_type = t2.log_type
and t.rn between t2.rn and t2.rn + 2;
...全文
201 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mcgrady0314 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wildwave 的回复:]
select * from(
select sys_log.*,
row_number()over(partition by log_type order by log_time desc)rn
from sys_log)
where rn<=3
[/Quote]正解
austo 2011-10-18
  • 打赏
  • 举报
回复
row_number()over(partition by log_type order by log_time desc)rn
学习
shiyiwan 2010-01-06
  • 打赏
  • 举报
回复
标准sql,没可能吧,各数据库取前几条记录的sql写法都是不同的

比如sqlserver/mysql中是select top N.
Oracle中rownum <= N
DB2中可以用percent
ghostzitee 2010-01-06
  • 打赏
  • 举报
回复
还有一个问题 ,这种方法应该只能用在 Oracle数据库上吧, 有没有标准SQL支持的方法啊?
ghostzitee 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wildwave 的回复:]
select * from(
select sys_log.*,
  row_number()over(partition by log_type order by log_time desc)rn
from sys_log)
where rn <=3
[/Quote]这个挺简单 3Q
lovelrforever 2010-01-06
  • 打赏
  • 举报
回复
标准可以实现,但是性能会大打折扣
wh62592855 2010-01-06
  • 打赏
  • 举报
回复
标准SQL的话使用自连接应该也可以实现
只不过可能会非常麻烦
如果不是特别必要的话就是用系统提供的函数吧
Phoenix_99 2010-01-06
  • 打赏
  • 举报
回复
select * from(
select sys_log.*,
row_number()over(partition by log_type order by log_time desc)rn
from sys_log)
where rn <=3
小灰狼W 2010-01-05
  • 打赏
  • 举报
回复
select * from(
select sys_log.*,
row_number()over(partition by log_type order by log_time desc)rn
from sys_log)
where rn<=3
suiziguo 2010-01-05
  • 打赏
  • 举报
回复
ORACLE分析函数
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧