id   name   regtime 
1    张1    20120107
2    张2    20120102
3    张3    20120106
4    张4    20120104
5    张5    20120105
6    张6    20120105
7    张7    20120106
8    张8    20120107
9    张9    20120108
10   张10   20120109求小于20120106时间最近的name值,与小于20120106时间总行数??
有没有一条语句搞定的方法?
两条也可以贴出来

解决方案 »

  1.   

    with t as
    (
    select 1 id,'张1' name, '20120107' regtime   from dual union 
    select 2 ,'张2', '20120102' from dual union 
    select 3 ,'张3', '20120106' from dual union 
    select 4 ,'张4', '20120104' from dual union 
    select 5 ,'张5', '20120105' from dual union 
    select 6 ,'张6', '20120105' from dual union 
    select 7 ,'张7', '20120106' from dual union 
    select 8 ,'张8', '20120107' from dual union 
    select 9 ,'张9', '20120108' from dual union 
    select 10 ,'张10', '20120109' from dual
    )
    select name, (select count(1) from t where regtime < '20120106') cou
      from t
     where regtime in
          
           (select '20120106' -
                   (select s
                      from (select min(b.regtime - a.regtime) s
                              from t a, t b
                             where a.id != b.id
                               and b.regtime = '20120106'
                               and a.regtime < b.regtime) tt) as regtime
              from dual)
      

  2.   

    小于20120106时间最近的name值怎么定义,如果最近只有20120105的,但是有好几条记录,那选哪一条记录的name啊?
      

  3.   

    楼主好像没有说,如果 结果有 多个 name,怎么处理?
      

  4.   

    好久不写SQL 了,试试
    不是很考虑数据量的SQL
    select name,total as 总数
    from (
    select name,
           sum(1) over(order by regtime  ) as total,
           row_number() over(order by regtime  desc) as rn,
           regtime  
      from tb
     where regtime  > 日期
     )
     where rn=1;
      

  5.   

    2 张2 20120102 应为这一条。四条。
    我上面的描述可能有误,可csdn 不让改贴。
    结如果应该是张2,总共四条。
    数据量很大有没有效率高一些的。
      

  6.   

    没看明白2楼的那一大段,改了一下,结果一样。
    with t as
    (
    select 1 id,'张1' name, '20120107' regtime from dual union 
    select 2 ,'张2', '20120102' from dual union 
    select 3 ,'张3', '20120106' from dual union 
    select 4 ,'张4', '20120104' from dual union 
    select 5 ,'张5', '20120105' from dual union 
    select 6 ,'张6', '20120105' from dual union 
    select 7 ,'张7', '20120106' from dual union 
    select 8 ,'张8', '20120107' from dual union 
    select 9 ,'张9', '20120108' from dual union 
    select 10 ,'张10', '20120109' from dual
    )
    select name, (select count(1) from t where regtime < '20120106') cou
      from t
     where regtime in
      (select MAX(regtime) FROM t
              WHERE regtime < '20120106')
      

  7.   


    with t as
    (
    select 1 id,'张1' name, '20120107' regtime from dual union  
    select 2 ,'张2', '20120102' from dual union  
    select 3 ,'张3', '20120106' from dual union  
    select 4 ,'张4', '20120104' from dual union  
    select 5 ,'张5', '20120105' from dual union  
    select 6 ,'张6', '20120105' from dual union  
    select 7 ,'张7', '20120106' from dual union  
    select 8 ,'张8', '20120107' from dual union  
    select 9 ,'张9', '20120108' from dual union  
    select 10 ,'张10', '20120109' from dual
    )select name,ct
    from
    (select name,
            row_number() over(order by regtime) rn,
            count(id) over(order by regtime desc) ct
    from t
    where regtime < 20120106)
    where rn=1
         name    ct
    ----------------------
    1 张2 4