with t(userid,money,dttime,year) as
(
select 1,200,to_date('2012-03-04','yyyy-mm-dd'),2012 from dual
union all select 1,200,to_date('2012-05-04','yyyy-mm-dd'),2012 from dual
union all select 2,200,to_date('2012-05-04','yyyy-mm-dd'),2012 from dual
union all select 2,200,to_date('2012-03-04','yyyy-mm-dd'),2012 from dual
)
select * from t where dttime=(select max(dttime) from t t1 where t.userid=t1.userid and t.year=2012);
/*
    USERID      MONEY DTTIME               YEAR                                 
---------- ---------- -------------- ----------                                 
         1        200 04-5月 -12           2012                                 
         2        200 04-5月 -12           2012  
*/

解决方案 »

  1.   


    --或者你这样写,结果一样的
    with t(userid,money,dttime,year) as
    (
    select 1,200,to_date('2012-03-04','yyyy-mm-dd'),2012 from dual
    union all select 1,200,to_date('2012-05-04','yyyy-mm-dd'),2012 from dual
    union all select 2,200,to_date('2012-05-04','yyyy-mm-dd'),2012 from dual
    union all select 2,200,to_date('2012-03-04','yyyy-mm-dd'),2012 from dual
    )
    select userid,money,dttime,year from (select row_number() over(partition by userid order by dttime desc) rn
    ,userid,money,dttime,year from t where year=2012) where rn=1;
    /*
        USERID      MONEY DTTIME               YEAR                                 
    ---------- ---------- -------------- ----------                                 
             1        200 04-5月 -12           2012                                 
             2        200 04-5月 -12           2012 
    */
      

  2.   

    select * from t where dttime=(select max(dttime) from t t1 where t.userid=t1.userid and t.year=2012);---》后面的from t t1 where t.userid=t1.userid,还要两个表t t1么?多谢
      

  3.   

    出事数据:select a.userid,a.money,a.dttime,a.year from t_data a,t_data b
    where a.userid =b.userid and a.dttime>b.dttime;
    查询结果:
      

  4.   

    用分析函数 ROW_NUMBER() OVER(PARTITION BY userid,year order by dttime desc) rn
    取出 rn=1的记录即可