数据有 表user_info 字段
user_name,pay_year,pay_month,pay
===========================================
潮汐猎人  2010      9        1000
潮汐猎人  2010      8        800
潮汐猎人  2010      7        1200
撼地神牛  2010      10       300
撼地神牛  2010      9        400
撼地神牛  2010      8        500
鱼人守卫  2010      10       66
鱼人守卫  2010      9        66
鱼人守卫  2010      8        65要求返回结果
潮汐猎人 2010   9   1000
撼地神牛 2010   10  300
鱼人守卫 2010   10  66即按user_name分组后返回每组中距离现在日期最近的那一条记录的所有字段  一定要所有字段啊  求SQL

解决方案 »

  1.   

    select *
    from user_info u
    where not exists(select * from user_info where user_name=u.user_name
       and pay_year*12+pay_month>u.pay_year*12+u.pay_month)
      

  2.   

    select username,max(pay_year),max(pay_month),max(pay)
    from user_info 
    group by username,max(pay_year),max(pay_month)
      

  3.   

    2楼 group by 里面也能用max?
      

  4.   

    SQL> select *
      2    from user_info t
      3   where exists
      4   (select user_name, max(pay_year || lpad(pay_month, 2, '0'))
      5            from user_info b
      6           where b.user_name = t.user_name
      7           group by user_name
      8          having max(pay_year || lpad(pay_month, 2, '0')) = t.pay_year || lpad(t.pay_month, 2, '0'));
     
    USER_NAME  PAY_YEAR PAY_MONTH         PAY
    ---------- -------- --------- -----------
    潮汐猎人       2010         9        1000
    撼地神牛       2010        10         300
    鱼人守卫       2010        10          66
     
    SQL> 
    SQL> select user_name, pay_year, pay_month, pay
      2    from (select t.*,
      3                 row_number() over(partition by user_name order by pay_year desc, pay_month desc) rn
      4            from user_info t)
      5   where rn = 1
      6  ;
     
    USER_NAME  PAY_YEAR PAY_MONTH         PAY
    ---------- -------- --------- -----------
    潮汐猎人       2010         9        1000
    撼地神牛       2010        10         300
    鱼人守卫       2010        10          66
     
    SQL> 
      

  5.   


    SELECT user_name,pay_year,pay_month,pay FROM (
           SELECT user_name,pay_year,pay_month,pay,
           Row_Number()over(PARTITION BY user_name ORDER BY pay_year||to_char(To_Number(pay_month),'00') desc) rn FROM user_info  

    WHERE rn=1 ;
      

  6.   

    --刚刚的应该是错的,试试这个 比较复杂等高手的
    select username,pay_year,pay_month,pay
    from
    (select username,pay_year,pay_month,pay,
    row_number() over(partition by username order by to_number(pay_year||pay_month) desc) rn 
    from user_info)
    where rn=1