今天偶然做了一个实验
SELECT E.*,
       MAX(SAL) OVER(PARTITION BY JOB ORDER BY SAL ASC) A,
       MAX(SAL) OVER(PARTITION BY JOB ORDER BY SAL DESC) B
  FROM EMP E;
 
查询结果如图
我的疑惑是为什么相同JOB组,返回确有不同。
还请大家指教。可用分不多了,请见谅!

解决方案 »

  1.   

    我大概明白了点意思,
    相同的JOB Manager,应该分成了两组。
    SALESMAN  同理
      

  2.   

    一个是ASC 一个是DESC一个是顺序排序,一个是倒序排序结果不正常是正确的吧。。
      

  3.   

    为什么相同JOB的 max会不一样呢?如字段A
      

  4.   

           MAX(SAL) OVER(PARTITION BY JOB ORDER BY SAL ASC) A,
           MAX(SAL) OVER(PARTITION BY JOB ORDER BY SAL DESC) B你这两句是矛盾的,不可能按照JOB分组后,并同时按照SAL正序和倒序排序.
    只有b列的分组排序是有效的,a列的max(sal)其实只是针对一条记录.
      

  5.   

    我记得哪里看过这个原理,记得那次的表达式是这样的SELECT E.*,
           MIN(SAL) OVER(PARTITION BY JOB ORDER BY SAL ) A,
           MAX(SAL) OVER(PARTITION BY JOB ORDER BY SAL ) B
      FROM EMP E;
    想要的结果是同时取最大和最小,结果取不出来,默认升序,有一种结果只能取到当前行,原理好像是通过TRACE事件跟踪出来的,自己试试吧
    要取得最大和最小,要使用下面的语句SELECT E.*,
           MIN(SAL) OVER(PARTITION BY JOB ORDER BY SAL ASC) A,
           MAX(SAL) OVER(PARTITION BY JOB ORDER BY SAL DESC) B
      FROM EMP E;
      

  6.   

    求和,就知道了啊……
    SELECT E.*,
           MAX(SAL) OVER(PARTITION BY JOB ORDER BY SAL ASC) A,
           MAX(SAL) OVER(PARTITION BY JOB ORDER BY SAL DESC) B,
            SUM(SAL) OVER(PARTITION BY JOB ORDER BY SAL ASC) C,
           SUM(SAL) OVER(PARTITION BY JOB ORDER BY SAL DESC) D
    FROM EMP E;
      

  7.   

    max min avg sum count 不应该在over中用order by 字句 否则统计效果是从首行到当前行如果非要用 在后面加上 rows between unbounded preceding and unbounded following
      

  8.   

    MAX() OVER(PARTITION BY  ORDER BY ) 中 有2种情况:
    1.当不加order by时,就是一个组里的所有值sum的结果。
    2.当加上order by 时, 从一个组里的第一行加,第二行就是第一行加第二行,一直加到此组里最后一行。所有你分别升序和降序的结果不同。
      

  9.   

    很简单,楼主,你这样拆分一哈应该就明白了,我这里举例一下:
    建表
    create table myFirst
    (
    ENAME VARCHAR2(50),
    JOB VARCHAR2(50),
    SAL NUMBER(10,2),
    SALE_DATE DATE
    );--查看数据
    select * from myFirst;SMITH CLERK         800 2004-10-1 2:01:01
    BLAKE MANAGER         100 2004-10-2 2:01:05
    JONES MANAGER  200 2004-10-1 2:01:08
    WARD SALESMAN 200 2004-10-3 2:01:08
    MARTIN SALESMAN 100 2014-12-1 2:01:08
    ALLEN SALESMAN 300 2008-9-1 2:01:08--用AVG的倒序分析
    SELECT 
               A.*,
               avg(SAL) OVER(PARTITION BY JOB ORDER BY SAL desc) SUMA
       FROM
                myFirst A;SMITH CLERK         800 2004-10-1 2:01:01 800
    JONES MANAGER  200 2004-10-1 2:01:08 200
    BLAKE MANAGER         100 2004-10-2 2:01:05 150
    ALLEN SALESMAN 300 2008-9-1 2:01:08 300
    WARD SALESMAN 200 2004-10-3 2:01:08 250
    MARTIN SALESMAN 100 2014-12-1 2:01:08 200--再用正序分析
    SELECT 
               A.*,
               avg(SAL) OVER(PARTITION BY JOB ORDER BY SAL ASC) SUMA
       FROM
                myFirst A;  SMITH CLERK      800 2004-10-1 2:01:01 800
    BLAKE MANAGER         100 2004-10-2 2:01:05 100
    JONES MANAGER     200 2004-10-1 2:01:08 150
    MARTIN SALESMAN 100 2014-12-1 2:01:08 100
    WARD SALESMAN 200 2004-10-3 2:01:08 150
    ALLEN SALESMAN 300 2008-9-1 2:01:08 200
    楼主可以仔细看哈数据就明白了其中的机制,关注顺序。出现你那种情况其实主要是ASC起作用后,你没有理解到DESC的作用。