有一个日志表(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;

解决方案 »

  1.   

    select * from(
    select sys_log.*,
      row_number()over(partition by log_type order by log_time desc)rn
    from sys_log)
    where rn<=3
      

  2.   

    还有一个问题 ,这种方法应该只能用在 Oracle数据库上吧, 有没有标准SQL支持的方法啊?
      

  3.   

    标准sql,没可能吧,各数据库取前几条记录的sql写法都是不同的比如sqlserver/mysql中是select top N.
    Oracle中rownum <= N
    DB2中可以用percent
      

  4.   

    select * from( 
    select sys_log.*, 
      row_number()over(partition by log_type order by log_time desc)rn 
    from sys_log) 
    where rn <=3
      

  5.   

    标准SQL的话使用自连接应该也可以实现
    只不过可能会非常麻烦 
    如果不是特别必要的话就是用系统提供的函数吧
      

  6.   

    row_number()over(partition by log_type order by log_time desc)rn
    学习