现有一个视图V1,其执行后结果可能为如下格式:
一级单位ID     二级单位ID      员工数
101            10001           1
101            10002           3
102            10003           2
102            10005           4
103            10004           7现在需要对此视图的查询结果进行统计,可能是按一级单位,也可能是按二级单位进行分组,要求取得SUM(员工数)最大的前两条记录,请问这个SQL语句除了 select * from (select 一级单位ID,SUM(员工数) from V1 group by 一级单位ID  order by SUM(员工数)) where rownum <= 2 这样写之外,有没有其他写法?因为小弟现在在用公司前辈写好的一些数据访问模块编程,所有的查询语句都是以XML形式组织的,因此需要尽量避免查询中嵌套子查询,因为如果需要有类似上面的子查询的话就需要建视图了,比较麻烦,所以想请问各位大拿有没有其他方法可以实现,谢谢了,问题解决马上给分

解决方案 »

  1.   

    要取结果集中的某几条记录,还是要用到rownum
      

  2.   

    小弟也想用rownum啊,可惜用rownum的话就需要先对查询结果进行排序,那样就需要子查询了。我好象听说可以用OVER和PARTITION来实现,可惜小弟不知道具体怎么做,有哪位前辈可以帮帮忙?
      

  3.   

    按序号取某几条记录必须要子查询的,分析函数也不例外,你这种情况就没必要整分析函数,如果是下面情况,才有用分析函数的必要:一级单位ID     二级单位ID      员工数
    101            10001           1
    101            10001           1
    101            10002           3
    101            10001           2
    101            10003           1
    102            10004           2
    102            10004           2
    102            10005           2
    102            10006           4
    103            10007           7要取每个一级单位下,员工数最多的二级单位及其员工数,如:
    101            10001           4
    101            10002           3
    102            10004           4
    102            10006           4
    103            10007           7这种情况下适合用分析函数:
    SELECT *
      FROM (SELECT 一级单位ID,二级单位ID,
                   SUM(员工数),
                   row_number() over(PARTITION BY 一级单位ID ORDER BY SUM(员工数) DESC) rn
              FROM V1
             GROUP BY 一级单位ID, 二级单位ID
             ORDER BY SUM(员工数))
     WHERE rn <= 2