求 Oracle Sql语句,最好不要使用存储过程,原数据格式是这样的,
有name(varchar2),city_name(varchar2),reg_time(date) 三个字段,
  name        city_name         reg_time
  张三          广东        2012-01-11 12:10:00  
  李四          广东        2012-02-10 12:00:00
  王五          江西        2012-04-12 10:40:00
  张三          湖南        2012-05-12 15:40:00
  李四          湖北        2012-05-02 10:40:00
  张三          河南        2012-03-12 15:40:00
  王五          淅江        2012-05-12 10:40:00
  张三          广西        2012-04-16 17:40:00先要将name 字段相同的记录排在一起,然后再按 reg_time 最大的记录发在最前,
 按一般的分组查询则为这样的结果 
 name        city_name         reg_time
  李四          湖北        2012-05-02 10:40:00
  李四          广东        2012-02-10 12:00:00
  王五          淅江        2012-05-12 10:40:00
  王五          江西        2012-04-12 10:40:00
  张三          湖南        2012-05-12 15:40:00
  张三          广西        2012-04-16 17:40:00
  张三          河南        2012-03-12 15:40:00
  张三          广东        2012-01-11 12:10:00  现在要得到的效果是name 相同的排在一起,但要按照reg_time 最新的整个组放在最前;
张三的reg_time 最新,所以应该排在最前面,其次是王五,最后则是李四。
  name        city_name         reg_time
  张三          湖南        2012-05-12 15:40:00
  张三          广西        2012-04-16 17:40:00
  张三          河南        2012-03-12 15:40:00
  张三          广东        2012-01-11 12:10:00  
  王五          淅江        2012-05-12 10:40:00
  王五          江西        2012-04-12 10:40:00
  李四          湖北        2012-05-02 10:40:00
  李四          广东        2012-02-10 12:00:00

解决方案 »

  1.   

    如果要固定人的层次 可以用union all来合并
      

  2.   

    按正常的排序下来 
    create table t1 (name nvarchar2(10),city_name nvarchar2(10),reg_time date);insert into t1 values ('张三','广东',to_date('2012-01-11 12:10:00','yyyy-mm-dd hh24:mi:ss'));
    insert into t1 values ('李四','广东',to_date('2012-02-10 12:00:00','yyyy-mm-dd hh24:mi:ss'));
    insert into t1 values ('王五','江西',to_date('2012-04-12 10:40:00','yyyy-mm-dd hh24:mi:ss'));
    insert into t1 values ('张三','湖南',to_date('2012-05-12 15:40:00','yyyy-mm-dd hh24:mi:ss'));
    insert into t1 values ('李四','湖北',to_date('2012-05-02 10:40:00','yyyy-mm-dd hh24:mi:ss'));
    insert into t1 values ('张三','河南',to_date('2012-03-12 15:40:00','yyyy-mm-dd hh24:mi:ss'));
    insert into t1 values ('王五','淅江',to_date('2012-05-12 10:40:00','yyyy-mm-dd hh24:mi:ss'));
    insert into t1 values ('张三','广西',to_date('2012-04-16 17:40:00','yyyy-mm-dd hh24:mi:ss'));
    commit;select * 
    from t1
    order by name,reg_time desc     name   city_name       reg_time 
    ---------------------------------------------------
    1 张三 湖南 2012/5/12 15:40:00
    2 张三 广西 2012/4/16 17:40:00
    3 张三 河南 2012/3/12 15:40:00
    4 张三 广东 2012/1/11 12:10:00
    5 李四 湖北 2012/5/2 10:40:00
    6 李四 广东 2012/2/10 12:00:00
    7 王五 淅江 2012/5/12 10:40:00
    8 王五 江西 2012/4/12 10:40:00
      

  3.   

    這裏直接用
    select *
    from table1
    order by name,reg_time desc
    就可以,希望能夠幫到你吧
      

  4.   

       select * from test_t t1
    inner join (
    select name,reg_time1,rownum rn from (select distinct name,max(reg_time) reg_time1 from  test_t group by name order by reg_time1 desc)) t2
    on t1.name= t2.name order by rn,reg_time desc
      

  5.   

    需要说明一下, 这样子写就没考虑效率了。
    --name city_name reg_time
    WITH t AS
      (SELECT '张三'            AS fname,
        '广东'                  AS city,
        '2012-01-11 12:10:00' AS regtime
      FROM dual
      UNION ALL
      SELECT '李四','广东','2012-02-10 12:00:00' FROM dual
      UNION ALL
      SELECT '王五','江西','2012-04-12 10:40:00' FROM dual
      UNION ALL
      SELECT '张三','湖南','2012-05-12 15:40:00' FROM dual
      UNION ALL
      SELECT '李四','湖北','2012-05-02 10:40:00' FROM dual
      UNION ALL
      SELECT '张三','河南','2012-03-12 15:40:00' FROM dual
      UNION ALL
      SELECT '王五','淅江','2012-05-12 10:40:00' FROM dual
      UNION ALL
      SELECT '张三','广西','2012-04-16 17:40:00' FROM dual
      UNION ALL
      SELECT '麦六','淅江','2012-05-15 10:40:00' FROM dual
      UNION ALL
      SELECT '麦六','广西','2012-04-16 17:40:00' FROM dual
      )
    select t.* from (
    select * from (
    SELECT fname,
      city,
      to_date(regtime,'yyyy-mm-dd hh24:mi:ss') AS regtime,
      rank()over(partition by fname order by to_date(regtime,'yyyy-mm-dd hh24:mi:ss') desc) as rankg
    FROM t
    ) where rankg = 1 order by regtime desc
    ) a right join t on a.fname=t.fname--结果
    FNAME  CITY   REGTIME             
    ------ ------ ------------------- 
    麦六   广西   2012-04-16 17:40:00 
    麦六   淅江   2012-05-15 10:40:00 
    张三   河南   2012-03-12 15:40:00 
    张三   湖南   2012-05-12 15:40:00 
    张三   广东   2012-01-11 12:10:00 
    张三   广西   2012-04-16 17:40:00 
    王五   淅江   2012-05-12 10:40:00 
    王五   江西   2012-04-12 10:40:00 
    李四   广东   2012-02-10 12:00:00 
    李四   湖北   2012-05-02 10:40:00 
      

  6.   


    --你的需求我理解了。但是貌似还是不能做到我上面所理解的效果。仅仅只能分组排序
    --如果在分组之后和组内排序之后还要做到整体"组"的排序怕是不行
    --小生才疏学浅爱莫能助
    select name,reg_time from
    (select name,reg_time,rank()over(partition by name order by reg_time desc) as num from t1) s