有如下表A(ACTION_NO VARCHAR2(20),
          FB_YEAR,  CHAR(4),
          FB_WEEK,  CHAR(2),
          FB_DESC,  VARCHAR2(2000)
          ……)
记录各条行动的周反馈信息,现表中已有多条行动(各条行动的ActionNo号不一样,每条行动可能有条或多条反馈,年度有从2009年到2010年,周次也各不一样)如下:ACTION_NO    FB_YEAR,   FB_WEEK,   FB_DESC,  ……
0001         2009       35         ****
0001         2009       45         ****
0001         2010       04         ****
0001         2010       06         ****
0003         2009       50         ******
0003         2010       02         ****
0003         2010       03         ****
……………………………………
……………………………………求一SQL语句能够查询出各条行动的最新反馈情况,即查询出数据
0001         2010       06        *****   ……
0003         2010       03        *****   ……
……………………
……………………表中有多少个不同的行动号,查询结果就应该是多少条,每条结果应该是该行动号最新一次的反馈情况。。实在写不出该语句了,向大虾求解!!

解决方案 »

  1.   


    --try it
    select ACTION_NO    FB_YEAR,  FB_WEEK,  FB_DESC
    from
    (
    select ACTION_NO    FB_YEAR,  FB_WEEK,  FB_DESC,
    row_number()over(partition by ACTION_NO order by FB_YEAR desc,FB_WEEK desc) rn
    from A
    )
    where rn = 1
      

  2.   

    select ACTION_NO,FB_YEAR,FB_WEEK,FB_DESC,... from
       (select ACTION_NO,FB_YEAR,FB_WEEK,FB_DESC,...,rank () over (partition by ACTION_NO order by FB_YEAR desc,FB_WEEK desc) rank)
    where rank=1;
      

  3.   

    select ACTION_NO,FB_YEAR,FB_WEEK,FB_DESC,... from 
      (select ACTION_NO,FB_YEAR,FB_WEEK,FB_DESC,...,rank () over (partition by ACTION_NO order by FB_YEAR desc,FB_WEEK desc) rank from a) 
    where rank=1;中间少了from。
      

  4.   


    Create Table A(ACTION_NO VARCHAR2(20),
              FB_YEAR  VARCHAR2(4),
              FB_WEEK  VARCHAR2(2),
              FB_DESC VARCHAR2(2000) );
    Insert Into a Values('0001','2009','35','aaa');
    Insert Into a Values('0001','2009','32','bbb');
    Insert Into a Values('0001','2010','31','ccc');
    Insert Into a Values('0001','2010','03','ddd');
    Insert Into a Values('0001','2011','03','ffff');
    Insert Into a Values('0003','2008','14','ggg');
    Insert Into a Values('0003','2010','27','eee');
    Insert Into a Values('0003','2011','03','ffff');
    Insert Into a Values('0003','2011','04','ffff');
    Select Action_No, Fb_Year, Fb_Week, Fb_Desc
      From (Select Action_No,
                   Fb_Year,
                   Fb_Week,
                   Fb_Desc,
                   Row_Number() Over(Partition By Action_No Order By Fb_Year Desc, Fb_Week Desc) Rn
              From a)
     Where Rn = 1
      

  5.   

    --方法1
    SELECT *
      FROM a
     WHERE (action_no, FB_YEAR || FB_WEEK) IN
           (SELECT ACTION_NO, MAX(FB_YEAR || FB_WEEK) FROM a GROUP BY ACTION_NO);
           
    --方法2
    WITH a1 AS
     (SELECT row_number() over(PARTITION BY ACTION_NO ORDER BY FB_YEAR, FB_WEEK) rn, a.* FROM a)
    SELECT ACTION_NO FB_YEAR, FB_WEEK, FB_DESC
      FROM a1
     WHERE (ACTION_NO, rn) IN (SELECT ACTION_NO, MAX(rn) rn FROM a1 GROUP BY ACTION_NO);
      

  6.   

    select * from a t
    where not exists(
      select 1 from a where action_no=t.action_no
        and fb_year||fb_week>t.fb_year||t.fb_week)