database:oracl
table:table1
字段:分类、年、月、城市、金额、其它...
要求:按照 分类、年、月、城市 进行分类,然后按金额进行排序,最后在每个分类的基础上,取出前20条数据。也就是说:对table1中的所有数据,先按分类区分开来,在这基础上,再按年进行分类,然后是月、城市。分类好后,对每个分类按金额由大到小排列。最后提取每个分类前20条数据。我自己先前的方法:select * from table1 where 分类=? and 年=? and 月=? and 城市=? order by 金额 desc .然后取出前20条。
但是因为数据量很大,如果用这种循环的方法用sql语句一次20条的取出,要取某一“分类”下的数据,就得循环出500多条sql语句。我觉得效率会不会受影响。
我现在想用sql语句一次取出所有数据,现在能用 select * from table1 order by 分类, 年, 月, 城市, 金额 desc 把所有数据都排列好,但是没有办法取出每个分类 的前20条数据。
还忘大家能帮下忙。谢谢

解决方案 »

  1.   

    select 分类,年,月,日,城市,sum(金额) as 金额2 from table1 
    where 分类 in(select 分类 from table1 group by 分类) and rownum >0 and rownum<21
    group by 分类,年,月,日,城市
    order by 金额2 desc
      

  2.   

    本帖最后由 AWUSOFT 于 2009-07-06 11:25:42 编辑
      

  3.   

    楼主去看看
    http://www.itpub.net/thread-977507-1-1.html
      

  4.   

    问题解决:select * from 
      (select t.*,rank() over (partition  by 分类,年,月,城市 order by 金额  DESC ) rn from table1 t)
    where rn<=20 order by 年,月,城市,金额 desc ; 谢谢大家的支持!