库如下        ID        TYPE        NAME
        1         1          111
        2         1          222
        3         1          333
        4         2          444
        5         2          4535
        6         3          4564
        7         4          33456453
        8         5          456456
我想显示 TYPE 的头2条记录...也就是想要的结果是
       ID        TYPE        NAME
        1         1          111
        2         1          222
        4         2          444
        5         2          4535
        6         3          4564
        7         4          33456453
        8         5          456456
按照 type 来分组,显示每组中的前2条记录....
不知道我的意图有没有表达清楚...大家帮帮忙吧...

解决方案 »

  1.   

    SQL> WITH A AS (SELECT 1 ID,1 TYPE,'111' NAME FROM DUAL
      2             UNION
      3             SELECT 2 ID,1 TYPE,'222' NAME FROM DUAL
      4             UNION
      5             SELECT 3 ID,1 TYPE,'333' NAME FROM DUAL
      6             UNION
      7             SELECT 4 ID,2 TYPE,'444' NAME FROM DUAL
      8             UNION
      9             SELECT 5 ID,2 TYPE,'4535' NAME FROM DUAL
     10             UNION
     11             SELECT 6 ID,3 TYPE,'4564' NAME FROM DUAL
     12             UNION
     13             SELECT 7 ID,4 TYPE,'33456453' NAME FROM DUAL
     14             UNION
     15             SELECT 8 ID,5 TYPE,'456456' NAME FROM DUAL
     16             )
     17  SELECT * FROM (select ID,TYPE,NAME,ROW_NUMBER()OVER(PARTITION BY tYPE ORDER BY ID) RN FROM A) B
     18  WHERE RN<=2;
     
            ID       TYPE NAME             RN
    ---------- ---------- -------- ----------
             1          1 111               1
             2          1 222               2
             4          2 444               1
             5          2 4535              2
             6          3 4564              1
             7          4 33456453          1
             8          5 456456            1
     
    7 rows selected
     
      

  2.   

    歡迎大家踩哈我的ORACLE博客
    http://jack198409.itpub.net/
      

  3.   


    select m*TYPE,m.ID,m.NAME from
    (select *,rank() over(partition by TYPE order by ID) curr_rank from Test)m
    where curr_rank<=2;这里用到了一个分析函数 over()analytic function 
    语法如下:
    Function(arg1,..., argn) OVER ( [PARTITION BY <...>] [ORDER BY <....>] [<window_clause>] )
    --<window_clause> is like "ROW <?>" or "RANK <?>" 
    RANK() and DENSE_RANK()都是根据某个字段或表达式做的范围划分 不过有区别的 看下例
    EG:SELECT empno, deptno, sal,
    RANK() OVER (PARTITION BY deptno
    ORDER BY sal DESC NULLS LAST) RANK,
    DENSE_RANK() OVER (PARTITION BY
    deptno ORDER BY sal DESC NULLS
    LAST) DENSE_RANK
    FROM emp
    WHERE deptno IN (10, 20)
    ORDER BY 2, RANK;EMPNO  DEPTNO   SAL  RANK DENSE_RANK
    ------ ------- ----- ----- ----------
      7839      10  5000     1          1
      7782      10  2450     2          2
      7934      10  1300     3          3
      7788      20  3000     1          1
      7902      20  3000     1          1
      7566      20  2975     3          2
      7876      20  1100     4          3
      7369      20   800     5          48 rows selected.