高分求oracle中根据类别查询出每类的前2条,按时间排序,以下为数据库脚本:不能用游标,只能使用纯SQL查询语句。create table test1
(
  tId number(10),
  tName varchar2(50),
  tType number(5),
  endTime Date
)
commit;
insert into test1 values(1,'test1',1,to_date('2002-08-26 12:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(2,'test2',1,to_date('2002-07-26 10:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(3,'test3',1,to_date('2002-06-26 12:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(4,'test4',1,to_date('2002-05-26 19:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(5,'test5',1,to_date('2002-04-26 17:12:12','yyyy-mm-dd HH24:mi:ss'));insert into test1 values(6,'test6',2,to_date('2004-08-26 12:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(7,'test7',2,to_date('2005-07-26 10:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(8,'test8',2,to_date('2006-06-26 12:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(9,'test9',2,to_date('2007-05-26 19:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(10,'test10',2,to_date('2008-04-26 17:12:12','yyyy-mm-dd HH24:mi:ss'));insert into test1 values(11,'test11',3,to_date('2009-08-26 12:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(12,'test12',3,to_date('2009-07-26 10:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(13,'test13',3,to_date('2009-06-26 12:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(14,'test14',3,to_date('2009-05-26 19:12:12','yyyy-mm-dd HH24:mi:ss'));
insert into test1 values(15,'test15',3,to_date('2009-04-26 17:12:12','yyyy-mm-dd HH24:mi:ss'));
commit;

解决方案 »

  1.   


    --时间降序
    select tId,tName,tType,endTime from (
         select tId,tName,tType,endTime,row_number()over(partition by tType order by endTime desc) rn from test1 
    )
    where rn<=2;
      

  2.   


    排序函数楼主好好看下oracle的分析函数,很好用的
      

  3.   

    select tId, tName,tType,endTime from
    (
      select t.* , (select count(1) from test1 where tType = t.tType and endTime > t.endTime) + 1 px from test1 t 
    ) m
    where px <= 2
      

  4.   

    支持下,今天这种题目很多啊。看来大家都要好好学习Oracle的分析函数了。
    row_number()
    1 2 3 4 ...
    rank()
    1 2 2 4 ...
    dense_rank()
    1 2 2 3 ...
      

  5.   


    select tId,tName,tType,endTime
    from
    (select tId,tName,tType,endTime,
    row_number() over(partition by tType order by endTime desc) rn
    from test1) a
    where rn=2
      

  6.   

    select tId,tName,tType,endTime
    from
    (select tId,tName,tType,endTime,
    row_number() over(partition by tType order by endTime desc) rn
    from test1) a
    where rn<=2
      

  7.   

    哦 是前两条呀 
    select tId,tName,tType,endTime
    from
    (select tId,tName,tType,endTime,
    row_number() over(partition by tType order by endTime desc) rn
    from test1) a
    where rn<=2