有这样一张表A
fk_eventid       fk_assetid         sum 
90010              4                 80
90006              1                 20
90005              1                 15
90008              3                 50
90008              2                 40
90009              4                 100
90007              4                 70
90011              3                 30
现在我要得出这样的一个需求:得出每个fd_assetid的TOP2(按SUM排),然后在按SUM 降序排列
比如通过上面的数据可以得出下面的结果
90009       4        100
90010       4        80
90008       3        50
90008       2        40
90011       3        30
90006       1        20
90005       1        15谢谢各位....

解决方案 »

  1.   

    select fk_eventid,fk_assetid,sum
    from
    (select fk_eventid,fk_assetid,sum,row_number() over(partition by fk_assetid order by sum desc) recno
     from ttt) where recno<=2
    order by sum desc
    FK_EVENTID FK_ASSETID        SUM
    ---------- ---------- ----------
         90009          4        100
         90010          4         80
         90008          3         50
         90008          2         40
         90011          3         30
         90006          1         20
         90005          1         15
      

  2.   

    select fk_eventid,fk_assetid,sum
    from (select fk_eventid,fk_assetid,sum,row_number() over(partition by fk_assetid order by sum desc) rn from table1) 
    where rn<=2 order by fk_assetid desc,sum desc; 
      

  3.   


    select * from temp t
    order by  t.sum desc ,
    t.assid desc;1 90009 4 100
    2 90010 4 80
    3 90007 4 70
    4 90008 3 50
    5 90008 2 40
    6 90011 3 30
    7 90006 1 20
    8 90005 1 15
      

  4.   

    SELECT A.*
    FROM A
    ORDER BY ROW_NUMBER() OVER(ORDER BY SUM1 DESC)
      

  5.   

    SELECT A.*
    FROM A 
    ORDER BY SUM1 DESC
      

  6.   

    SQL> with a as (select 90010 fk_eventid, 4 fk_assetid, 80 sum1 from dual
      2             union
      3             select 90006 fk_eventid, 1 fk_assetid, 20 sum1 from dual
      4             union
      5             select 90005 fk_eventid, 1 fk_assetid, 15 sum1 from dual
      6             union
      7             select 90008 fk_eventid, 3 fk_assetid, 50 sum1 from dual
      8             union
      9             select 90008 fk_eventid, 2 fk_assetid, 40 sum1 from dual
     10             union
     11             select 90009 fk_eventid, 4 fk_assetid, 100 sum1 from dual
     12             union
     13             select 90007 fk_eventid, 4 fk_assetid, 70 sum1 from dual
     14             union
     15             select 90001 fk_eventid, 3 fk_assetid, 30 sum1 from dual
     16             )
     17  select fk_eventid,fk_assetid,sum1 
     18  from (select fk_eventid,fk_assetid,sum1,row_number()over(partition by fk_assetid order by sum1 
    desc ) rn from a )  
     19  where rn<=2 
     20  order by sum1 desc
     21  /FK_EVENTID FK_ASSETID       SUM1
    ---------- ---------- ----------
         90009          4        100
         90010          4         80
         90008          3         50
         90008          2         40
         90001          3         30
         90006          1         20
         90005          1         157 rows selected.
      

  7.   

    顶一下借个地方问个问题,这道题 在sql2000 里面应该怎么解决呀!